Die*_*ego 12 c# asp.net-mvc validationattribute data-annotations asp.net-mvc-3
我有一种复杂的模型.
我有我的UserViewModel,有几个属性,其中两个是HomePhone和WorkPhone.两种类型PhoneViewModel.在PhoneViewModel我有CountryCode,AreaCode和Number所有字符串.我想使CountryCode可选的,但AreaCode与Number强制性的.
这非常有效.我的问题是,这UserViewModel WorkPhone是强制性的,而HomePhone不是.
无论如何我可以通过在Require属性中PhoneViewModel设置任何属性来减少HomeWork属性吗?
我试过这个:
[ValidateInput(false)]
Run Code Online (Sandbox Code Playgroud)
但它只适用于类和方法.
码:
public class UserViewModel
{
[Required]
public string Name { get; set; }
public PhoneViewModel HomePhone { get; set; }
[Required]
public PhoneViewModel WorkPhone { get; set; }
}
public class PhoneViewModel
{
public string CountryCode { get; set; }
public string AreaCode { get; set; }
[Required]
public string Number { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
[更新于2012年5月24日,以使想法更清晰]
我不确定这是正确的方法,但我认为你可以扩展这个概念,并可以创建一个更通用/可重用的方法.
在ASP.NET MVC中,验证发生在绑定阶段.当您将表单发布到服务器时,DefaultModelBinder是从请求信息创建模型实例并将验证错误添加到服务器的表单ModelStateDictionary.
在您的情况下,只要绑定发生,HomePhone验证将启动,我认为我们无法通过创建自定义验证属性或类似的方式做很多事情.
我所想的只是HomePhone当表格中没有可用的值(areacode,countrycode和number或为空)时,根本不为属性创建模型实例,当我们控制绑定时,我们控制验证,为此,我们有创建自定义模型绑定器.
在自定义模型绑定器中,我们检查属性是否HomePhone以及表单是否包含其属性的任何值,如果不是,我们不绑定属性,并且不会发生验证HomePhone.简单地说,值的值HomePhone将为null UserViewModel.
public class CustomModelBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
{
if (propertyDescriptor.Name == "HomePhone")
{
var form = controllerContext.HttpContext.Request.Form;
var countryCode = form["HomePhone.CountryCode"];
var areaCode = form["HomePhone.AreaCode"];
var number = form["HomePhone.Number"];
if (string.IsNullOrEmpty(countryCode) && string.IsNullOrEmpty(areaCode) && string.IsNullOrEmpty(number))
return;
}
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}
Run Code Online (Sandbox Code Playgroud)
最后,您必须在global.asax.cs中注册自定义模型绑定器.
ModelBinders.Binders.Add(typeof(UserViewModel), new CustomModelBinder());
Run Code Online (Sandbox Code Playgroud)
所以你现在有一个以UserViewModel为参数的动作,
[HttpPost]
public Action Post(UserViewModel userViewModel)
{
}
Run Code Online (Sandbox Code Playgroud)
我们的自定义模型粘合剂发挥作用,形式不张贴的值相对AREACODE,COUNTRYCODE和数量的HomePhone,不会有任何验证错误和userViewModel.HomePhone为空.如果表单至少发布了这些属性的任何一个值,则验证将按HomePhone预期进行.
| 归档时间: |
|
| 查看次数: |
24616 次 |
| 最近记录: |