如何将ModelState.IsValid与复杂对象一起使用?

时间:2010-07-19 15:02:39

标签: asp.net-mvc-2

我正在使用NHibernate,我有一个Campaign类,它有一个Client类作为其成员之一,我试图在ModelState.IsValid中使用[HttpPost] public Create (CreateCampaignViewModel vm) {1}}方法。

由于我的ViewModel包含对象Campaign ModelStats.IsValid,因为我从表单而不是整个Client.Id对象传递Client,因此始终为false。

有没有办法让它在运行设置ModelState.IsValid的验证码之前加载客户端成员?或者,在我根据ClientId手动'检索客户端对象并将其绑定到Campaign后,有没有办法刷新ModelState的状态?

4 个答案:

答案 0 :(得分:1)

史蒂文桑德森就此发表了一篇博客文章。他删除了错误集合中没有传入值的任何项目。

http://blog.stevensanderson.com/2010/02/19/partial-validation-in-aspnet-mvc-2/

答案 1 :(得分:1)

您可能希望向操作方法的参数添加属性,以禁用Id的绑定:

[HttpPost]
public Create([Bind(Ignore="ClientId")]CreateCampaignViewModel vm)

答案 2 :(得分:0)

尝试使用控制器的UpdateModel方法中的一个重载。然后调用ModelState.IsValid。

答案 3 :(得分:0)

我相信SharpArch有一个可以加载NH对象的模型绑定器。但是,我不太喜欢这个想法......相反,我会使用一个单独的PostModel来保存已发布的表单值。如果您重新使用ViewModel来保存发布数据,那么通常会有很多无法发布的字段(如示例中的Client对象)或只读显示字段。

class CampaignPostModel{
    ...
    public int ClientId { get; set; }
}

您需要做的就是将属性名称与表单输入名称进行匹配,并将其作为后期操作方法的参数添加。