所以我有一个视图,需要传入和传出几个不同的对象和对象列表,我已经创建了一个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以允许索引。
答案 0 :(得分:6)
所以你的问题是模型绑定没有正确发生。
假设你有这两个模型:
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 http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
编辑 - 请注意,当Html Helpers生成名称值时,它基于传入的lambda值。所以
@Html.CheckBoxFor(m => state.IsChecked)
将生成以下名称
name="state.IsChecked"
由于你是在一个foreach中,你得到了错误的名称值。
答案 1 :(得分:1)
你想用@Html.HiddenFor(m => state)
从渲染的HTML中完成什么,看起来就像你的罪魁祸首。 @Html.HiddenFor(m => state.StateId)
会更合适吗?
此外,您可以将其放入第一个<td>
元素中,因为它已被隐藏,并且会使您的HTML有效。