当控制器验证错误返回视图时,AddImplicitRequiredAttributeForValueTypes = false不起作用

时间:2015-03-19 12:04:53

标签: c# validation asp.net-mvc-5

使用MVC5,我有一个int值不可为空的模型,不应该是可空的,但我不希望模型绑定器自动要求该字段(视图绑定到List<>和任何列表中的一个项目可能会留空,因此不会保存到db)所以我在Application_Start()中设置以下内容:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

最初显示我的视图时,此方法正常,但是当用户单击“保存”,所有验证通过时,“控制器操作”会执行其他交叉记录验证(例如,记录总数必须等于100)。如果验证失败,我会设置自定义错误并返回视图:

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

一旦总金额得到纠正,用户再次点击保存,现在隐含的必需验证开始在客户端发生,并且永远不会将HttpPost发送回Controller 更正:隐式验证发生在服务器端,而不是客户端。这与我在Application_Start中关闭的隐式验证相同(我在调试模式下检查过,当View返回错误时它仍然是假的)。

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

TIA -VG

1 个答案:

答案 0 :(得分:0)

我找到了一种解决方法,我不称之为“解决方案”,但至少它是一种解决方案,以防其他人认为这有用。起初我认为隐式验证发生在客户端,但不是,它确实进入Controller但ModelState.IsValid现在是假的。这很重要,因为我的解决方法依赖于控制器被发送到控制器。这是我做的:

//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现在将返回true(只要当然不存在其他错误),并且能够继续使用保存逻辑。我希望这是有道理的。

-VG