我们有可能从GET操作加载的数据对于发布可能无效,并且希望能够在首次加载数据时显示验证消息。验证全部使用ValidationAttributes在服务器端进行。
如何在首次加载数据时强制显示验证摘要?我猜我需要以某种方式强制错误进入ModelState,但我首先需要让它们脱离模型类。
答案 0 :(得分:1)
我最终为模型类添加了一个验证方法,它为ModelState添加了错误。然后我创建并添加了一个自定义ModelValidator和AssociatedValidatorProvider 在表单绑定期间进行的正常验证期间调用它。这样,不直接绑定到Model类的控制器操作仍然可以调用模型的.Validate(ModelState)方法来伪造验证。这种方法适用于仅服务器端验证。
UserInfo 模型类:
private IEnumerable<RuleViolation> GetRuleViolations()
{
List<RuleViolation> violationList = new List<RuleViolation>();
if (String.IsNullOrWhiteSpace(FirstName))
violationList.Add(new RuleViolation("First Name is required.", FirstName"));
return violationList;
}
public void Validate(System.Web.Mvc.ModelStateDictionary ModelState)
{
foreach (RuleViolation violation in GetRuleViolations())
{
ModelState.AddModelError(violation.PropertyName, violation.ErrorMessage);
}
}
这可以直接从控制器操作中使用。在此操作中,Model类对象作为UserSearch模型的一部分返回。
public ActionResult Search(UserSearch model)
{
if (this.ModelState.IsValid)
{
model.Search();
if (model.UserInfo != null )
{
model.UserInfo.Validate(ModelState);
}
}...
对于我正在处理的特定用例,这就是我所要做的。但是我继续完成了在回发上进行“正常”验证的工作:创建了一个简单的ModelValidator,Validate覆盖看起来像这样。如果您在所有Model类中都遵循上述模式,那么您也可以为它们重新使用它。
public override IEnumerable<ModelValidationResult> Validate(object container)
{
var results = new List<ModelValidationResult>();
if (Metadata.Model != null)
{
UserInfoViewModel uinfo = Metadata.Model as UserInfoViewModel;
foreach (var violation in uinfo.GetRuleViolations())
{
results.Add(new ModelValidationResult
{
MemberName = violation.PropertyName,
Message = violation.ErrorMessage
});
}
}
return results;
}
最后,扩展AssociatedValidationProvider以返回此ModelValidator并将其添加到Application_Start中的ModelValidationProviders集合中。在http://dotnetslackers.com/articles/aspnet/Customizing-ASP-NET-MVC-2-Metadata-and-Validation.aspx#s2-validation
上写了这个答案 1 :(得分:0)
我不知道你是否理解你需要的东西,但这就是它......
使用jquery
运行验证以在加载表单时显示验证摘要$(document).ready(function() {
$('#FormId').valid();
});