2010-07-26 232 views
2

根据规范,复杂子属性(又名“嵌套对象”)仅在为其中一个嵌套对象的属性找到输入时才会生效。ASP.NET MVC 2验证嵌套对象

例如,如果Person具有属性{string Name,Address HomeAddress}并且Address具有属性{Street,City},并且一个动作接受Person类型的参数,则Person.HomeAddress.Street和Person.HomeAddress.City是只有在输入表单具有这些嵌套属性的输入编辑器时才被验证。

有什么办法可以强制MVC验证嵌套对象,即使没有找到他们的属性输入?

谢谢!

+0

你只是想要一个空验证呢? – Wil 2010-07-26 12:54:53

+0

例如,Person.HomeAddress.Street/City可能具有必需的属性(或任何其他验证属性)。 而且,Person.HomeAddress不应该为空。 – user191898 2010-07-26 20:35:42

回答

3

我不这么认为,因为验证是DefaultModelBinder

protected virtual void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) { 
    Dictionary<string, bool> startedValid = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase); 

    foreach (ModelValidationResult validationResult in ModelValidator.GetModelValidator(bindingContext.ModelMetadata, controllerContext).Validate(null)) { 
     string subPropertyName = CreateSubPropertyName(bindingContext.ModelName, validationResult.MemberName); 

     if (!startedValid.ContainsKey(subPropertyName)) { 
      startedValid[subPropertyName] = bindingContext.ModelState.IsValidField(subPropertyName); 
     } 

     if (startedValid[subPropertyName]) { 
      bindingContext.ModelState.AddModelError(subPropertyName, validationResult.Message); 
     } 
    } 

用下面的代码完成您可以尝试使用一个隐藏的表单字段中Person.Address财产像这样欺骗模型绑定

<%= Html.HiddenFor(m => m.Address) %> 

<%= Html.HiddenFor(m => m.Address.FirstLine) %> //just pick any property 

这可以揭开序幕模型联编程序进行验证。虽然如果这确实起作用,那么你将不可能投入价值,因为它是一个隐藏的表单字段,但我相信这是你想要的:)

或者你可以尝试编写你自己的模型绑定器,但从我的经验来看,如果你开始反对MVC框架的谷物,它会回来咬你