您發現這很困難,因爲您沒有充分利用MVC框架的功能,所以請允許我提供一個工作示例。
首先亮相,讓我們創建一個視圖模型來封裝視圖的數據要求:
public class SubjectGradesViewModel
{
public SubjectGradesViewModel()
{
Subjects = new List<Subject>();
}
public List<Subject> Subjects { get; set; }
}
接下來,創建一個類來表示你的主題模式:
public class Subject
{
public int Id { get; set; }
public string Name { get; set; }
public List<Student> StudentEntries { get; set; }
}
最後一個類來表示一個學生:
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Grade { get; set; }
}
在這一點上,你有所有你需要的類代表你的數據。現在,讓我們創建兩個控制器動作,包括一些樣本數據,所以你可以看到這是如何工作:
public ActionResult Index()
{
var model = new SubjectGradesViewModel();
// This sample data would normally be fetched
// from your database
var compsci = new Subject
{
Id = 1,
Name = "Computer Science",
StudentEntries = new List<Student>()
{
new Student { Id = 1, Name = "CompSci 1" },
new Student { Id = 2, Name = "CompSci 2" },
}
};
var maths = new Subject
{
Id = 2,
Name = "Mathematics",
StudentEntries = new List<Student>()
{
new Student { Id = 3, Name = "Maths 1" },
new Student { Id = 4, Name = "Maths 2" },
}
};
model.Subjects.Add(compsci);
model.Subjects.Add(maths);
return View(model);
}
[HttpPost]
public ActionResult Index(SubjectGradesViewModel model)
{
if (ModelState.IsValid)
{
return RedirectToAction("Success");
}
// There were validation errors
// so redisplay the form
return View(model);
}
現在是時候建造的意見,當涉及到數據發送回控制器,這部分就顯得尤爲重要。首先登場的是Index
觀點:
@model SubjectGradesViewModel
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
@Html.EditorFor(m => m.Subjects) <br />
<input type="submit" />
}
你我只是使用Html.EditorFor
,同時傳遞Subjects
作爲參數注意。我這樣做的原因是因爲我們要創建一個EditorTemplate
來代表Subject
。稍後我會解釋更多。現在,只知道EditorTemplates
和DisplayTemplates
是MVC中的特殊文件夾名稱,因此它們的名稱和位置很重要。
我們實際上要創建兩個模板:一個用於Subject
,另一個用於Student
。要做到這一點,請按照下列步驟操作:
- 創建視圖的當前文件夾內的文件夾
EditorTemplates
(例如,如果你的觀點是Home\Index.cshtml
,創建文件夾Home\EditorTemplates
)。
- 在該目錄中創建一個名稱與您的模型匹配的強類型視圖(即在這種情況下,您將創建兩個視圖,分別稱爲
Subject.cshtml
和Student.cshtml
(同樣,命名很重要))。
Subject.cshtml
應該是這樣的:
@model Subject
<b>@Model.Name</b><br />
@Html.HiddenFor(m => m.Id)
@Html.HiddenFor(m => m.Name)
@Html.EditorFor(m => m.StudentEntries)
Student.cshtml
應該是這樣的:
@model Student
@Html.HiddenFor(m => m.Id)
@Html.HiddenFor(m => m.Name)
@Html.DisplayFor(m => m.Name): @Html.EditorFor(m => m.Grade)
<br />
就是這樣。如果您現在構建並運行此應用程序,請在POST
索引操作中添加一個斷點,您會看到模型已正確填充。
那麼,什麼是EditorTemplates
,和他們的對應,DisplayTemplates
?它們允許您創建視圖的可重用部分,使您可以更多地組織您的視圖。
關於他們的好處是模板幫手,即Html.EditorFor
和Html.DisplayFor
,足夠聰明,知道他們何時處理集合的模板。這意味着您不必循環播放項目,每次都需要手動調用模板。您也不必執行任何null
或Count()
檢查,因爲幫助人員將爲您處理所有問題。你留下的觀點是乾淨的,沒有邏輯。
EditorTemplates
當您希望將收集發佈到控制器操作時,也會生成適當的名稱。這使得模型綁定到一個列表,比自己生成這些名稱要簡單得多。有時你仍然需要這樣做,但這不是其中之一。
你如何將模型發送到'OptionalMarks' GET方法的視圖? –
是的。首先找到一個科目列表,併爲每個科目,得到一個學生名單 –