在EF/MVC中,是否可以编辑虚拟属性?

本文关键字:编辑 虚拟 属性 是否 EF MVC | 更新日期: 2023-09-27 18:12:46

所以我有以下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();
}

当然,这不会将更改保存给Users,事实上,它甚至不会看到传入的更改

在EF/MVC中,是否可以编辑虚拟属性?

你的问题是你用错误的方式写你的视图。如果你想绑定包含列表的模型,你应该为它们设置特殊的名称。

类似:

@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>
}

应该有公共setter:

[Table("Company")]
public class Company {
    public virtual List<UserAccount> Users {
        get;
        set;
    }
}
  1. 你的公司模型的Users属性需要一个公共setter。没有它,模型绑定器将无法创建要填充的新List实例。

  2. 你不能在你的视图中使用foreach循环,因为html助手不会呈现正确的标签。在这里你需要使用常规的for循环。

我遵循Kirill Bestemyanov提供的答案,但做了一些修改:

[Table("Company")]
public class Company {
    public virtual List<UserAccount> Users {
        get;
        set;
    }
}

和View:

@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();