これにはEditorTemplatesを使用できます。以下の例は、通常のフォーム投稿の例を示しています。serialize
メソッドを使用してフォーム値を送信することにより、必要に応じてそれをajaxifyできます。
コースの学生名のリストを編集する必要があると仮定します。それでは、そのためのいくつかのビューモデルを作成しましょう
public class Course
{
public int ID { set;get;}
public string CourseName { set;get;}
public List<Student> Students { set;get;}
public Course()
{
Students=new List<Student>();
}
}
public class Student
{
public int ID { set;get;}
public string FirstName { set;get;}
}
次に、GET
アクションメソッドで、ビューモデルのオブジェクトを作成し、Students
コレクションを初期化して、強く型付けされたビューに送信します。
public ActionResult StudentList()
{
Course courseVM=new Course();
courseVM.CourseName="Some course from your DB here";
//Hard coded for demo. You may replace this with DB data.
courseVM.Students.Add(new Student { ID=1, FirstName="Jon" });
courseVM.Students.Add(new Student { ID=2, FirstName="Scott" });
return View(courseVM);
}
次に、 Views/ YourControllerNameの下にEditorTemplatesというフォルダーを作成します。次に、以下のコンテンツで呼び出されたビューの下に新しいビューを作成しますStudent.cshtml
@model Student
@{
Layout = null;
}
<tr>
<td>
@Html.HiddenFor(x => x.ID)
@Html.TextBoxFor(x => x.FirstName ) </td>
</tr>
メインビュー(StudentList.cshtml)で、EditorTemplateHTMLヘルパーメソッドを使用してこのビューを表示します。
@model Course
<h2>@Model.CourseName</h2>
@using(Html.BeginForm())
{
<table>
@Html.EditorFor(x=>x.Students)
</table>
<input type="submit" id="btnSave" />
}
これにより、テーブル行に含まれるテキストボックスに各学生名を含むすべてのUIが表示されます。Students
これで、フォームが投稿されると、MVCモデルバインディングのビューモデルのプロパティにすべてのテキストボックスの値が含まれるようになります。
[HttpPost]
public ActionResult StudentList(Course model)
{
//check for model.Students collection for each student name.
//Save and redirect. (PRG pattern)
}
Ajaxifiedソリューション
これをAjaxifyする場合は、送信ボタンのクリックをリッスンし、フォームを取得してシリアル化し、同じポストアクションメソッドに送信できます。保存後にリダイレクトする代わりに、操作のステータスを示すJSONを返すことができます。
$(function(){
$("#btnSave").click(function(e){
e.preventDefault(); //prevent default form submit behaviour
$.post("@Url.Action("StudentList",YourcontrollerName")",
$(this).closest("form").serialize(),function(response){
//do something with the response from the action method
});
});
});