Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC验证嵌套对象_Asp.net Mvc_Validation - Fatal编程技术网

Asp.net mvc MVC验证嵌套对象

Asp.net mvc MVC验证嵌套对象,asp.net-mvc,validation,Asp.net Mvc,Validation,我有一个由几个字段和嵌套对象组成的复杂模型 我的目标是仅当至少一个属性具有值时才验证嵌套对象 范例 public class MyModel { public Submodel element; } public class Submodel { [required] public string attr1; [required] public string attr2; } 我已经进行了客户端验证。但是这些字段被发布为空,服务器端验证仍然失败 有什么想法吗

我有一个由几个字段和嵌套对象组成的复杂模型

我的目标是仅当至少一个属性具有值时才验证嵌套对象

范例

public class MyModel 
{ 
  public Submodel element; 
}

public class Submodel 
{
  [required] 
  public string attr1;

  [required] 
  public string attr2;
}
我已经进行了客户端验证。但是这些字段被发布为空,服务器端验证仍然失败


有什么想法吗?

只要您在模型的属性上有
[必需的]
注释,如果该属性为空,您的模型将无法通过验证(即
ModelState.IsValid
将为false)。如果您希望至少有一个
attr1
attr2
具有要通过验证的值,则可以在自定义注释中定义该值,或者将
ModelState.IsValid
与您自己的验证结合起来。例如:

[HttpPost]
public ActionResult SomeAction(MyModel model)
{
  if (!ModelState.IsValid || !YourValidationFunction(model, ModelState))
   {
     return View(Model);
   }
}

public bool YourValidationFunction(MyModel model, ModelStateDictionary modelState)
{
   if (model.submodel.attr1 == null && model.submodel.attr2 == null)
    {
        modelState.AddModelError("submodel.attr1", "only 1 attr can be null!");
        modelState.AddModelError("submodel.attr2", "only 1 attr can be null!");
        return false;
    }
    return true;
}

ModelStateDictionary
的参数存在,以便在服务类中使用此函数;如果两个函数都在控制器中,则不需要它。

验证对象以测试其中一个属性/字段是否有值的另一种方法是实现
IValidateableObject

public class SubModel : IValidateableObject
{
    public string attr1 {get;set;}
    public string attr2 {get;set}

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (attr1 == null | attr2 == null) //or some other criteria
        {
            yield return new ValidationResult("Some validation message here");
        }
    }
}
公共类子模型:IValidTeableObject
{
公共字符串attr1{get;set;}
公共字符串attr2{get;set}
公共IEnumerable验证(ValidationContext ValidationContext)
{
if(attr1==null | attr2==null)//或其他一些条件
{
返回新的ValidationResult(“此处有一些验证消息”);
}
}
}

要使用它,在动作方法中只需使用标准的
ModelState.IsValid
,它将调用
子模型中的
Validate
,如果它为null,MVC将不会进行验证。当然,这就是
RequiredAttribute
所做的。它验证了值不是
null
@StephenMuecke:在你降级之前,请阅读整个句子和问题的上下文。你甚至没有意识到你在我的回答中说了同样的话。在这个问题中,OP在属性上具有
RequiredAttribute
,并且由于该值为null,因此未通过验证。也许是你的英语,所以让我解释一下:“不验证”在这里的意思是“不通过验证”。你答案的第一行是错误的。如果属性用
[Required]
属性修饰,它将进行验证(并且
ModelState
将无效)。如果你改变你回答的措辞,我将取消否决票。不,不是。因为我的第一行的意思正是您想说的:“模型将无法通过验证”,所以,
ModelState.IsValid
将为false。你认为这样说更容易理解吗?也许你是对的。让我们不要有任何混淆的空间-我修改了我的措辞。你是说如果两个属性都
null
那么它是有效的,但是如果用户输入一个属性,那么必须同时提供这两个属性才能有效吗?