asp.net – MVC 4模型回归null
所以我有一个视图,需要传入和传出几个不同的对象和对象列表,我已经创建了一个viewmodel.我的viewmodel看起来像这样
public class EditUserViewModel { public ManageUsersViewModel ManageUsersViewModel { get; set; } public IEnumerable<StateModel> StateModel { get; set; } } 我遇到问题的部分是StateModel,看起来像这样 public class StateModel { public bool IsChecked { get; set; } public States States { get; set; } public UsersInStates UsersInStates { get; set; } } 并包含这个 [Table("States")] public class States { [Key] public int StateId { get; set; } public string State { get; set; } } [Table("UsersInStates")] public class UsersInStates { [Key,Column(Order = 1)] public int UserId { get; set; } [Key,Column(Order = 2)] public int StateId { get; set; } public string LicenseNumber { get; set; } } 在我看来,我或多或少试图遍历状态并获取UsersInStates的用户输入.这就是我试图完成它但我的整个StateModel返回null的方式.进入视图,StateModel.States有数据而UsersInStates没有.这就是我认为的样子 @foreach (var state in Model.StateModel) { @Html.HiddenFor(m => state) <tr> <td> @Html.CheckBoxFor(m => state.IsChecked) </td> <td> @Html.Label(state.States.State) </td> <td> @Html.EditorFor(m => state.UsersInStates.LicenseNumber) </td> </tr> } 任何建议将不胜感激.一切都显示应该和ManageUsersViewModel部分工作正常它只是返回到控制器的StateModel数据是空的我不完全确定如何按照我喜欢的方式使这项工作. 这就是生成的html在表的开头和请求的第一行中的样子 <table style="margin-left:auto; margin-right:auto; text-align:center"> <input id="state" name="state" type="hidden" value="WebSiteNew.Models.StateModel" /> <tr> <td> <input data-val="true" data-val-required="The IsChecked field is required." id="state_IsChecked" name="state.IsChecked" type="checkbox" value="true" /> <input name="state.IsChecked" type="hidden" value="false" /> </td> <td> <label for="Alabama">Alabama</label> </td> <td> <input class="text-box single-line" id="state_UsersInStates_LicenseNumber" name="state.UsersInStates.LicenseNumber" type="text" value="" /> </td> </tr> 回答: 好的,为了解决这个问题,我使用了一个for循环,如下面答案中列出的两个参考文献中所述 @for (int i = 0; i < Model.StateModel.Count(); i++) { <tr> <td> @Html.HiddenFor(m => m.StateModel[i].States.StateId) @Html.HiddenFor(m => m.StateModel[i].States.State) @Html.CheckBoxFor(m => m.StateModel[i].IsChecked) </td> <td> @Html.Label(Model.StateModel[i].States.State) </td> <td> @Html.EditorFor(m => m.StateModel[i].UsersInStates.LicenseNumber) </td> </tr> } 对于任何看到这个的人都要注意,我必须将我的EditUsersViewModel中的IEnumerable更改为IList以允许索引. 解决方法
所以你的问题是模型绑定没有正确发生.
假设你有这两个型号: public class ParentModel { public string Name {get;set;} public ChildModel Child {get;set;} } public class ChildModel { public string ChildName {get;set;} public int SomeNumber {get;set;} } 您生成的HTML(为了正确发生模型绑定)需要如下所示: <input name="Name" value="(Not relevant to this example)"/> <input name="Child.ChildName" value="(Not relevant to this example)" /> 请注意名称字段的结构 – 这是MVC如何确定哪些输入值映射到视图模型中的哪些属性.使用嵌套属性,属性名称必须放在它前面. 随着集合,它变得更加复杂.模型绑定器需要知道哪些值与属性的哪个实例相关. 例如,如果我们假设ChildModel在前面的示例中是IEnumerable类型,那么您的HTML可能看起来像这样,以便正确地建模绑定: <input name="Name" value="(Not relevant to this example)"/> <input name="Child[0].ChildName" value="(Not relevant to this example)" /> <input name="Child[0].SomeNumber" value="(Not relevant to this example)"/> <input name="Child[1].ChildName" value="(Not relevant to this example)" /> <input name="Child[1].SomeNumber" value="(Not relevant to this example)"/> 看看这些如何解决它: http://seesharpdeveloper.blogspot.com/2012/05/mvc-model-binding-to-list-of-complex.html 编辑 – 同样重要的是要注意,当Html Helpers生成名称值时,它基于传入的lambda值.所以 @Html.CheckBoxFor(m => state.IsChecked) 将生成以下名称 name="state.IsChecked" 由于你是一个foreach,你得到的名称错误的值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net:如何在button onclick上使用eventargs进行参数传递
- asp.net – 脚本管理器控件实际上是做什么的?
- asp.net-mvc – 以任何方式配置配置visual studio mvc构建视
- asp.net-mvc – MVC 4 Code First属性上的ForeignKeyAttrib
- ASP.NET客户端与服务器视图呈现
- asp.net-mvc – ToDataSourceResult扩展不填充DataSourceRe
- asp.net – 实体框架“等待操作超时”就简单的DeleteAll
- Asp.net MVC中Razor常见的问题与解决方法总结
- asp.net – 我如何计算出我的服务器可以处理的最大负载?
- asp.net-mvc-3 – MVC3:超出最大请求长度