所以我有以下两种模式:
[Table("Company")]
public class Company {
public virtual List<UserAccount> Users {
get {
// I load my users here
}
}
}
[Table("UserAccount")]
public class UserAccount {
public string email { get; set; }
}
在我看来,我尝试编辑它:
@model MyXsite2013.Company
<table>
foreach (UserAccount ua in Model.Users) {
<tr class="noRowHover">
<td>
@Html.TextBoxFor(modelItem => ua.email)
</td>
</tr>
}
</table>
在回发时,我尝试保存:
public ActionResult Edit(Company companyModel) {
Company companyContext = database.Companies.Find(companyModel.ID);
database.Entry(companyContext).CurrentValues.SetValues(companyModel);
companyContext.IsActive = true;
database.SaveChanges();
}
这当然不会保存对用户的更改,事实上,它甚至没有看到更改。
答案 0 :(得分:1)
您的问题是您以错误的方式撰写视图。如果要绑定包含列表的模型,则应为它们设置特殊名称。
类似的东西:
@model MyXsite2013.Company
<table>
@{
var i=0;
}
@foreach (UserAccount ua in Model.Users) {
<tr class="noRowHover">
<td>
<input type="text" name="Model.Users[@i].email"/>
</td>
</tr>
i++;
}
</table>
有关此主题的更多信息here
<强>更新强>
您可以使用HtmlHelper方法:
@using(Html.BeginForm("Post", "Home", FormMethod.Post))
{
int i = 0;
foreach (var ua in Model.Users)
{
@Html.TextBox(string.Format("Model.Users[{0}].email", i), ua.email)
i++;
}
<button type="submit">Submit</button>
}
应该有公共制定者:
[Table("Company")]
public class Company {
public virtual List<UserAccount> Users {
get;
set;
}
}
答案 1 :(得分:0)
您公司模型的用户属性需要公共设置者。没有它,模型绑定器将无法创建要填充的新List实例。
您不能在视图中使用foreach循环,因为html帮助程序不会呈现正确回发所需的正确标记。你需要在那里使用常规for循环。
答案 2 :(得分:0)
我按照Kirill Bestemyanov提供的答案,但做了一些修改:
[Table("Company")]
public class Company {
public virtual List<UserAccount> Users {
get;
set;
}
}
观点:
@model MyXsite2013.Company
<table>
@{
var i=0;
}
@foreach (UserAccount ua in Model.Users) {
<tr class="noRowHover">
<td>
<input type="text" name="Users[@i].email" value="@ua.email"/>
</td>
</tr>
i++;
}
</table>
回发:
foreach (UserAccount ua in companyModel.Users) {
UserAccount UA_Context = database.UserAccounts.Find(ua.ID);
database.Entry(UA_Context).CurrentValues.SetValues(ua);
}
database.SaveChanges();