【发布时间】:2014-10-31 06:55:14
【问题描述】:
我的 MVC 模型是这样的 2 个必填字段和 2 个可选的必填字段 [如果 HasOptional 属性为 true ,则只有最后 2 个字段是必填的]
[Required(ErrorMessage="Required...")]
public string Title { get; set; }
[Required(ErrorMessage="Required...")]
public string Publisher { get; set; }
public bool HasOptional{get;set;}
public string OptTitle { get; set; }
public string OptPublisher { get; set; }
所以在控制器 POST 操作中我所做的是
if(model.HasOptional)
{
if (string.IsNullOrEmpty(Convert.ToString(model.OptTitle)))
{
ModelState.AddModelError.Add("OptTitle","required....");
}
if (string.IsNullOrEmpty(Convert.ToString(model.OptPublisher)))
{
ModelState.AddModelError.Add("OptPublisher","required....");
}
}
如果该属性为空,我会在没有任何问题的情况下查看验证消息。但我的问题是 如果我在视图中填充 OptTitle/OptPublisher 并更改文本框的焦点,我仍然可以在屏幕上看到验证消息。 填写信息后有什么方法可以让验证消失[比如前两个属性 Title 和 Publisher 的默认行为]
【问题讨论】:
-
您只是在创建服务器端错误。为了进行客户端错误验证(以便它们消失),您需要创建 jquery.validate 和 jquery.validate.unobtrusive 可以使用的客户端规则。我建议您查看 foolproof's
[RequiredIf]属性,该属性将同时处理服务器端和客户端验证 -
RequiredIf 只能用于 bool 属性对吗?在我的实际情况中,我必须使用 Enumerator 属性 [可能需要 3 个可能的值]。有问题我只是为了简单起见将它用作 bool
-
Foolproof 有许多您可以查看的验证属性。在您的情况下(如果
HasOptional=true,我假设您希望OptTitle和OptPublisher是必需的),将RequiredIf("HasOptional", ErrorMessaage=....)]添加到OptTitle和OptPublisher将起作用 -
我怎样才能将RequiredIf设置为特定值。如果HasOptional是“abc”,那么我需要将OptPublisher设置为Required
-
但是属性
HasOptional是一个布尔值,所以我不确定我是否理解。但是您可以使用其他类似RequiredIfRegExMatch的方法(我认为是[RequiredIfRegExMatch("HasOptional", "abc", Error...)]。当然,您可以随时实现自己的。
标签: c# asp.net-mvc-3 validation razor