ASP.NET MVC绑定排除不在视图模型中的嵌套对象上工作?

时间:2010-12-07 01:27:59

标签: c# .net asp.net-mvc-3 model-binding

我一直遇到这样的问题,但一劳永逸地想知道发生了什么:)

我有一个简单的ASP.NET MVC视图,它绑定到视图模型类MemberViewModel

MemberViewModel包含一个Linq To Sql实体对象,我的表单主要绑定到名为Member,但是我确实有三个其他表单字段绑定到名为Member.User的子类。

Member包含有关用户的个人信息,Member.User包含用户名+密码信息,这两者都存储在数据库的单独表格中。

现在正如我所说,视图的模型对象使用名为MemberViewModel的自定义视图模型类,其内容如下:

[Bind(Exclude = "EncryptedPassword")]
public class MemberViewModel : ViewModel
{
    public Member Member { get; set; }

    public string Password { get; set; }
    [DisplayName("Confirm Password")]
    public string ConfirmPassword { get; set; }

    public MemberViewModel() { }
    public MemberViewModel(Member member, SelectList countryList)
    {
        Member = member;
        CountryList = countryList;
    }
}

您可以看到只有一个Member的引用。 Member是一个Linq to Sql对象,里面有User的引用。 Password + ConfirmPassword并且仅构成字段,并且在Linq To Sql中没有等效的对应项。

现在我的问题是,每当我提交表单时,我的ModelState.IsValid属性总是返回false,表明模型错误为The EncryptedPassword field is invalid

现在,无论我是将[Bind(Exclude = "Member.User.EncryptedPassword")]添加到MemberViewModel作为类属性,还是将User本身的部分类添加为[Bind(Exclude = "EncryptedPassword")]ModelState.IsValid不断声明它无效。

  1. 如何使其运行并从模型状态验证中排除子属性?
  2. Bind Exclude如何真正起作用,对于子对象和与视图模型一起使用模型绑定的最佳实践是什么?
  3. 最基本的问候, GONeale

2 个答案:

答案 0 :(得分:5)

[Bind]属性仅影响模型绑定。也就是说,ASP.NET MVC框架是否会尝试从请求中填充属性。

你的问题与验证有关 - 一个完整的其他野兽。 :)

答案 1 :(得分:0)

虽然不是您问题的直接答案,但我可以提供一些建议:尝试使用DTO在控制器和视图之间传递数据

你会发现许多第三方组件和库都做出了这样的假设,因此从长远来看它会让你的生活变得更轻松。

通过DTO我指的是简单的 - 通常是扁平的 - 物体,看起来像这样:

public class Dto
{
    public string PropertyName { get; set; }
    public string PropertyNameSubPropertyName { get; set; }
}

有关更多信息,以及有助于dtos和amp;之间映射的工具。域对象,请查看Automapper ..