【问题标题】:In EF/MVC, is it possible to edit virtual property?在 EF/MVC 中,是否可以编辑虚拟属性?
【发布时间】:2013-05-08 15:10:35
【问题描述】:

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

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

【问题讨论】:

  • 根据我对你的问题的理解。我们不能在这种激情中使用,因为虚拟关键字用于外键目的。如果我们使用 virtual 关键字,则意味着集合将是延迟加载。如果我错了,请纠正我。
  • 请阅读thisthis。在 post 操作中成功绑定后,您会读取 Company,然后更新它的属性和集合(合并\删除所有+添加)。
  • 你应该用@using (Html.BeginForm()) { }包裹你的表格。

标签: c# asp.net-mvc entity-framework razor


【解决方案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;
    }
}

【讨论】:

  • 你能澄清一下这个部分吗:,我不相信它有效。
  • 当然应该是,
  • 我添加了使用 HtmlHelper 方法生成正确标记的代码示例。
  • 既然可以使用ua.email,为什么还要使用Model.Users[@i].email?这样你就可以使用 foreach 循环作为 for 循环..
  • 如果您想在提交时将其绑定到模型中的列表,您应该生成名称包含当前列表项索引的标记。所以你应该使用计算列表项的变量。我建议通过参考阅读 Hancelman 的文章。
【解决方案2】:
  1. 您的公司模型的用户属性需要一个公共设置器。没有它,模型绑定器将无法创建新的 List 实例来填充。

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

【讨论】:

    【解决方案3】:

    我遵循了 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 2015-09-20
      • 2014-11-01
      • 1970-01-01
      相关资源
      最近更新 更多