【问题标题】:ASP.NET MVC 2: Linq to SQL entity w/ ForeignKey relationship and Default ModelBinder strangenessASP.NET MVC 2:Linq to SQL 实体 w/ ForeignKey 关系和默认 ModelBinder 陌生性
【发布时间】:2012-07-29 04:11:40
【问题描述】:

我再次遇到了 Linq to Sql 和 MVC 模型绑定器的问题。

我有 Linq to Sql 生成的类,为了说明它们,它们看起来类似于:

public class Client
{
    public int ClientID { get; set; }
    public string Name { get; set; }
}

public class Site
{
    public int SiteID { get; set; }
    public string Name { get; set; }
}

public class User
{
    public int UserID { get; set; }
    public string Name { get; set; }
    public int? ClientID { get; set; }
    public EntityRef<Client> Client { get; set; }
    public int? SiteID { get; set; }
    public EntityRef<Site> Site { get; set; }
}

“用户”与“客户”和“网站”有关系 . User 类具有可为空的 ClientID 和 SiteID,因为管理员用户未绑定到客户端或站点。

现在我有一个视图,用户可以在其中编辑“用户”对象,该视图包含所有“用户”属性的字段。提交表单后,在我的 UserController 中调用适当的“保存”操作:

public ActionResult Save(User user, FormCollection form)
{
    //form['SiteID'] == 1
    //user.SiteID == 1

    //form['ClientID'] == 1
    //user.ClientID == null
}

这里的问题是 ClientID 从未设置,它始终为 null,即使该值在 FormCollection 中。

为了弄清楚出了什么问题,我在 Linq to Sql 设计器生成的类中为 ClientID 和 SiteID getter 和 setter 设置了断点。我注意到以下内容: 正在设置 SiteID,然后正在设置 ClientID,但是随后将 Client EntityRef 属性设置为空值,这反过来又将 ClientID 设置为空!我不知道为什么以及尝试设置 Client 属性的原因是什么,因为从不调用 Site 属性设置器,只调用 Client 设置器。

像这样从 FormCollection 手动设置 ClientID:

user.ClientID = int.Parse(form["ClientID"].ToString());

抛出“ForeignKeyReferenceAlreadyHasValueException”,因为它之前已经设置为 null。我发现的唯一解决方法是使用自定义方法扩展生成的部分 User 类:

Client = default(EntityRef<Client>)

但这不是一个令人满意的解决方案。我认为它不应该这样工作?

请有人告诉我。到目前为止,Linq to Sql 快把我逼疯了!

最好的问候

【问题讨论】:

    标签: asp.net-mvc linq-to-sql modelbinders


    【解决方案1】:

    我刚刚遇到了与 MVC 3 相同的问题。我认为这是因为模型绑定器在创建模型类时设置了模型类的 所有 公共属性。所以它将user.ClientID 设置为1,然后将user.Client 设置为null(因为它不存在于表单集合中)。之后user.ClientID 的值也变为null
    所以你只需要像这样从绑定中排除User类的Client属性:

    public ActionResult Save([Bind(Exclude="Client")]User user, FormCollection form)
    

    这对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多