我正在开发我的第一个ASP.NET MVC 3应用程序,我有一个看起来像这样:
@model IceCream.viewmodels.Note.Notesviewmodel @using (Html.BeginForm()) { @Html.ValidationSummary(true) @Html.TextBoxFor(m => m.Name) foreach (var item in Model.Notes) { @Html.EditorFor(m => item); } <input type="submit" value="Submit"/> }
我有一个EditorTemplate,看起来像这样:
@model IceCream.viewmodels.Note.Noteviewmodel <div> @Html.HiddenFor(m => m.NoteID) @Html.TextBoxFor(m => m.NoteText) @Html.CheckBoxFor(m => m.IsChecked) </div>
Notesviewmodel如下所示:
public class Notesviewmodel { public string Name { get; set; } public IEnumerable<Noteviewmodel> Notes { get; set; } }
Noteviewmodel如下所示:
public class Noteviewmodel { public int NoteID { get; set; } public System.DateTime Timestamp { get; set; } public string NoteText { get; set; } public bool IsChecked { get; set; } }
当它被传递到视图时,Notesviewmodel就会很好的被填充。但是,当单击提交按钮时,处理该帖子的控制器操作只具有viewmodel的Name属性的值。 Notes属性 – 用户已检查/取消选中的注释列表为空。当显示视图并发回viewmodel时,我们之间断开了这些TextBoxFor和CheckBoxFor元素。对此的指导?
解
感谢Mystere Man,让我直截了当。据我所知,基本上通过改变我的循环
@ Html.EditorFor(m => m.Notes)
改变了底层的HTML,我明白了在这个帖子上提供了正确的模型绑定。看看生成的HTML,我看到我得到以下生成的注释之一:
<div> <input id="Notes_0__NoteId" type="hidden" value="1" name="Notes[0].NoteId"> <input id="Notes_0__NoteText" type="text" value="Texture of dessert was good." name="Notes[0].NoteText"> <input id="Notes_0__IsChecked" type="checkBox" value="true" name="Notes[0].IsChecked> </div>
<div> <input id="item_NoteId" type="hidden" value="1" name="item.NoteId> <input id="item_NoteText" type="text" value="Texture of dessert was good." name="item.NoteText" > <input id="item_IsChecked" type="checkBox" value="true" name="item.IsChecked"> </div>
通过循环通过Notes,生成的HTML基本上失去对viewmodel的Notes属性的任何引用,并且当HTML被正确填充时,复选框值的设置无法将它们的值传递给viewmodel,我猜这是点的模型绑定。
所以我学到了一些东西,这很好。