对于多个必填字段的简单验证,我使用了here
解释的自定义验证器我正在获得所需的行为并且验证摘要消息正确显示,但我现在缺少的是无效输入元素上缺少验证错误css类, 在使用内置验证器时添加。
这是正确的行为:
<input class="input-validation-error" name="ModelName" ... />
这就是我在使用提到的自定义验证器时得到的结果:
<input name="ModelName" ... />
请注意,我指的是服务器端验证。
更新
这是我的模特:
public class Register
{
[MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
[Display(Name = "Name")]
public string Name { get; set; }
[MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
[Display(Name = "User name")]
public string UserName { get; set; }
}
这是渲染的输出:
<input class="text-box single-line" data-val="true" data-val-multifield="Please provide all required information" id="Name" name="Name" type="text" value="" />
<input class="text-box single-line" data-val="true" data-val-multifield="Please provide all required information" id="UserName" name="UserName" type="text" value="" />
我现在意识到只有当我使用 MultiFieldRequired 属性装饰我的整个模型类时才出现问题:
[MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
public class Register
{
...
在这种情况下,没有无效字段修改了css类,而在另一种情况下,当我对模型中的每个字段进行注释时,我得到相同的错误消息乘以无效字段的数量。
因此,总结一下 - 我想要一个错误消息,无论如何 无效字段的数量,我也希望每个无效字段 标有.input-validation-error class。
答案 0 :(得分:2)
我刚试过这个,它运作正常。这是我做的:
<强>控制器:强>
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(IndexModel model)
{
if (ModelState.IsValid)
{
return RedirectToAction("NextAction");
}
return View(model);
}
}
<强>型号:强>
public class IndexModel
{
[MultiFieldRequiredAttribute(new string[] { "AreaCode", "PhoneNumber" })]
public string AreaCode { get; set; }
[MultiFieldRequiredAttribute(new string[] { "AreaCode", "PhoneNumber" })]
public string PhoneNumber { get; set; }
}
我完全按照示例中提供的那样使用了验证:
public class MultiFieldRequiredAttribute : ValidationAttribute, IClientValidatable
{
private readonly string[] _fields;
public MultiFieldRequiredAttribute(string[] fields)
{
_fields = fields;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
foreach (string field in _fields)
{
PropertyInfo property = validationContext.ObjectType.GetProperty(field);
if (property == null)
return new ValidationResult(string.Format("Property '{0}' is undefined.", field));
var fieldValue = property.GetValue(validationContext.ObjectInstance, null);
if (fieldValue == null || String.IsNullOrEmpty(fieldValue.ToString()))
return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
}
return null;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage,
ValidationType = "multifield"
};
}
}
查看:强>
@model IndexModel
@using (Html.BeginForm())
{
@Html.EditorFor(m => m.AreaCode)
@Html.EditorFor(m => m.PhoneNumber)
<input type="submit" value="submit" />
}
如果您随后显示视图,则会显示以下区号:
<input class="text-box single-line" data-val="true" data-val-multifield="" id="AreaCode" name="AreaCode" type="text" value="" />
如果您然后单击提交按钮,您将获得以下内容:
<input class="input-validation-error text-box single-line" data-val="true" data-val-multifield="" id="AreaCode" name="AreaCode" type="text" value="" />
单击提交按钮时,会添加input-validation-error
。
答案 1 :(得分:1)
我原本期望视图中的无效字段会标记属性位置的 .input-validation-error 类方面,所以我使用自定义验证器属性来注释我的模型类像这样:
[MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
public class Register
{
[Display(Name = "Name")]
public string Name { get; set; }
[Display(Name = "User name")]
public string UserName { get; set; }
}
另一方面,如果我注释每个字段:
public class Register
{
[MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
[Display(Name = "Name")]
public string Name { get; set; }
[MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
[Display(Name = "User name")]
public string UserName { get; set; }
}
我的视图在验证摘要中生成多个相同的消息。
所以我最终使用 ValidationSummary 这样有一个自定义验证摘要错误消息:
@Html.ValidationSummary(true, "Please provide all required information")
我的字段用这样的简单星号装饰:
public class Register
{
[Required(ErrorMessage = "*")]
[Display(Name = "Name")]
public string Name { get; set; }
[Required(ErrorMessage = "*")]
[Display(Name = "User name")]
public string UserName { get; set; }
}
最后,我的视图呈现如下:
HTH