1

所以我有以下2个模型:

[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();
}

当然,这不会将更改保存到用户,事实上,它甚至没有看到更改的到来。

4

3 回答 3

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>

关于这个主题的更多信息在这里

更新

您可以使用 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;
    }
}
于 2013-05-08T15:19:38.013 回答
0
  1. 您的公司模型的用户属性需要一个公共设置器。没有它,模型绑定器将无法创建新的 List 实例来填充。

  2. 您不能在视图中使用 foreach 循环,因为 html 帮助程序不会呈现正确回发所需的正确标签。您需要在那里使用常规的 for 循环。

于 2013-05-08T15:25:45.993 回答
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();
于 2013-05-08T17:27:07.147 回答