1

我再一次遇到了 Linq to Sql 和 MVC Model Binder 的问题。

我有 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 从未设置,它始终为空,即使该值在 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 让我发疯!

此致

4

1 回答 1

1

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

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

这对我有用。

于 2012-07-28T20:11:40.960 回答