在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,事实上,它甚至不会看到传入的更改
你的问题是你用错误的方式写你的视图。如果你想绑定包含列表的模型,你应该为它们设置特殊的名称。
类似:
@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;
}
}
-
你的公司模型的Users属性需要一个公共setter。没有它,模型绑定器将无法创建要填充的新List实例。
-
你不能在你的视图中使用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();