C# ASP.NET MVC绑定排除不处理视图模型中的嵌套对象?
我已经有一段时间遇到这样的问题了,但我想知道到底发生了什么:) 我有一个简单的ASP.NET MVC视图,它绑定到视图模型类C# ASP.NET MVC绑定排除不处理视图模型中的嵌套对象?,c#,.net,asp.net-mvc-3,model-binding,C#,.net,Asp.net Mvc 3,Model Binding,我已经有一段时间遇到这样的问题了,但我想知道到底发生了什么:) 我有一个简单的ASP.NET MVC视图,它绑定到视图模型类MemberViewModel MemberViewModel包含一个Linq To Sql实体对象,我的表单主要绑定到名为Member的子类,但是我有大约三个其他表单字段绑定到名为Member.User的子类 Member包含有关用户的个人信息,Member.user包含用户名+密码信息,这两个信息都存储在数据库中的单独表中 现在,如我所述,视图的模型对象使用名为Memb
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;
}
}
您可以看到如何只有一个对成员的引用。成员是一个LINQtoSQL对象,其中包含对User
的引用Password
+ConfirmPassword
和表单字段,并且在Linq到Sql中没有等效的对应项
现在我的问题是,每当我提交表单myModelState.IsValid
属性时,总是返回false,说明模型错误为,EncryptedPassword字段无效
现在,无论我是将[Bind(Exclude=“Member.User.EncryptedPassword”)]
作为类属性添加到我的MemberViewModel
中,还是将用户的部分类本身作为[Bind(Exclude=“EncryptedPassword”)]
添加到ModelState.IsValid
中,都会持续声明它无效
我如何才能使其发挥作用并从模型状态验证中排除子属性
绑定排除是如何真正起作用的?对于子对象以及与视图模型一起使用模型绑定的最佳实践是什么
最亲切的问候,
GONeale属性[Bind]
只影响模型绑定。也就是说,ASP.NET MVC框架是否会尝试从请求中填充属性
您的问题与验证相关-一个完全不同的问题。:) 虽然不能直接回答您的问题,但我可以提供一些建议:尝试使用DTO在控制器和视图之间传递数据
你会发现很多第三方组件和库都有这样的假设,所以从长远来看,这会让你的生活更轻松
通过DTO,我指的是简单的(通常是平面的)对象,它看起来像这样:
public class Dto
{
public string PropertyName { get; set; }
public string PropertyNameSubPropertyName { get; set; }
}
有关更多信息,以及帮助DTO和域对象之间映射的工具,请查看..LINQ to SQL entitiy中的User.EncryptedPassword是什么数据类型?字符串(因此填充字符。此处)谢谢,难以置信!我意识到我有一个继承的AssociatedValidatorProvider
,它自动将从Linq提取的字段验证添加到Sql模式中。虽然很酷,但它为所有内容添加了验证,包括EncryptedPassword
,这显然是我不想在表单中出现的。在这里,我试图用Bind(Exclude)
修复它,正如您所说的,它根本不会影响验证-我真傻!我使用ModelState.Remove()
绕过了这些一次性字段。谢谢你的快速回答!