我再一次遇到了 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 让我发疯!
此致