2015-03-19 73 views
0

使用MVC5,我有一个int值不可为空并且不应为空的模型,但是我不希望模型联编程序自动需要该字段(视图绑定到一个列表<>然后在列表中任何一个项目可以是空的,因此不会保存到数据库),所以我设定的Application_Start()以下:当控制器验证错误返回视图时,AddImplicitRequiredAttributeForValueTypes = false不起作用

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

能正常工作时,我的视图最初显示,但当用户单击保存时,所有验证都会通过,然后控制器操作会执行其他跨记录验证(跨记录的总数必须等于100)。如果验证失败,然后我设置自定义错误并返回的观点:一旦总量修正

ModelState.AddModelError("", "Total Allocation must equal 100%."); 
return View("Shipment", shipment); 

,用户再次点击保存,现在 隐含要求确认开始在客户端发生并且永远不会将HttpPost发送回控制器 更正:隐式验证发生在服务器端,而不是客户端。这与我在Application_Start中关闭的隐式验证是一样的(我在调试模式下进行了检查,当View返回错误时它仍然是错误的)。

这是一个AddImplicitRequiredAttributeForValueTypes错误还是我做错了什么?

TIA -VG

回答

0

我发现了一个变通办法,我不会称之为一个“决议”,但至少它是在有人的情况下工作,否则周围发现这是很有帮助的。起初,我认为隐式验证发生在客户端,但不是,它确实将其加入到Controller中,但ModelState.IsValid现在是false。这很重要,因为我的解决方法依赖于将控制权发送给控制器。下面是我做的:

//Remove implicit validations 
foreach (KeyValuePair<string,ModelState> stateItem in ModelState) 
{ 
    if (stateItem.Key.Contains("AllocationAmount")) 
    { 
     if (stateItem.Value.Errors.Count > 0 && stateItem.Value.Errors[0].ErrorMessage.Contains("required")) 
     { 
      stateItem.Value.Errors.RemoveAt(0); 
     } 
    } 
} 

//Check Validation 
if (!ModelState.IsValid) 
{ 
    return PartialView("pvShipment", shipment); 
} 

通过检查有“必需的”错误消息,并且之前删除它检查ModelState.IsValid特定列,和isValid现在真(只要返回,因为没有其他错误当然存在),并且能够继续保存逻辑。我希望这是有道理的。

-VG

相关问题