我一直遇到这样的问题,但一劳永逸地想知道发生了什么:)
我有一个简单的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
不断声明它无效。
最基本的问候, GONeale
答案 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 ..