gpt4 book ai didi

c# - DataAnnotations "NotRequired"属性

转载 作者:可可西里 更新时间:2023-11-01 08:25:09 25 4
gpt4 key购买 nike

我有一个有点复杂的模型。

我有我的 UserViewModel,它有几个属性,其中两个是 HomePhoneWorkPhone。两者都是 PhoneViewModel 类型。在 PhoneViewModel 中,我有 CountryCodeAreaCodeNumber 所有字符串。我想让 CountryCode 可选,但 AreaCodeNumber 是必需的。

这很好用。我的问题是,在 UserViewModel 中,WorkPhone 是强制性的,而 HomePhone 不是。

我是否可以通过在 HomeWork 属性中设置任何属性来取消 PhoneViewModel 中的 Require 属性?

我已经试过了:

[ValidateInput(false)]

但它仅适用于类和方法。

代码:

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; }
}

最佳答案

[2012 年 5 月 24 日更新,使想法更清晰]

我不确定这是正确的方法,但我认为您可以扩展该概念并创建更通用/可重用的方法。

在 ASP.NET MVC 中,验证发生在绑定(bind)阶段。当您将表单发布到服务器时,DefaultModelBinder 会根据请求信息创建模型实例并将验证错误添加到 ModelStateDictionary

在您的情况下,只要 HomePhone 发生绑定(bind),验证就会启动,我认为我们不能通过创建 自定义验证属性或类似类型

(地区代码、国家代码和数字或为空)形式没有可用值时,我想的是根本不为 HomePhone 属性创建模型实例,当我们控制绑定(bind)时,我们就控制了验证,为此,我们必须创建一个自定义模型绑定(bind)器

自定义模型绑定(bind)器中,我们检查属性是否为HomePhone,以及表单是否包含其属性的任何值,如果不是,我们不绑定(bind)属性HomePhone 不会进行验证。简单地说,HomePhone 的值在 UserViewModel 中将为 null。

  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);
}
}

最后,您必须在 global.asax.cs 中注册自定义模型绑定(bind)器。

  ModelBinders.Binders.Add(typeof(UserViewModel), new CustomModelBinder());

现在您有一个将 UserViewModel 作为参数的操作,

 [HttpPost]
public Action Post(UserViewModel userViewModel)
{

}

我们的自定义模型 Binder 开始发挥作用,当然不会为 HomePhone 发布任何 areacode、countrycode 和 number 的值,不会有任何验证错误并且 userViewModel.HomePhone 为空。如果表单至少发布了这些属性的任何一个值,那么将按预期对 HomePhone 进行验证。

关于c# - DataAnnotations "NotRequired"属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10722428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com