2013-02-27 76 views
4

我有一个表格,其中有几个输入使用Html.TextBoxFor,每个输入都有一个ValidationMessageFor,它从ViewModel属性获取错误消息。在这个例子中,我们会假装这里只有一个输入:MVC4表格输入验证 - 自定义错误范围

@Html.TextBoxFor(x => x.Code) 
@Html.ValidationMessageFor(x => x.Code) 

当有一个模型误差,验证显示这是一对夫妇的跨度内的错误信息,如下所示:

<input type="text" value="" name="Code" id="Code" data-val-required="Personalised code is required" data-val="true" class="input-validation-error"> 
<span data-valmsg-replace="true" data-valmsg-for="Code" class="field-validation-error"> 
    <span for="Code" generated="true" class="">Personalised code is required</span> 
</span> 

如何我是否自定义此错误消息?

例如,将外跨度更改为div,并同时给出div和span跨度类别?

<div class="myOuterSpan" data-valmsg-replace="true" data-valmsg-for="Code" class="field-validation-error"> 
    <span class="myInnerSpan" for="Code" generated="true" class="">Personalised code is required</span> 
</div> 

或者只是有一个跨度?

<span class="errorWrapper" for="Code" generated="true">Code is required</span> 

或者将整个包裹在一个div中?

<div class="myOuterDiv"> 
    <span data-valmsg-replace="true" data-valmsg-for="Code" class="field-validation-error"> 
     <span for="Code" generated="true" class="">Personalised code is required</span> 
    </span> 
</div> 

你的想法...

我根据我对Darin的答案的解决方案,创造了CustomValidationMessage,不是customValidationMessageFOR因为我最初打算在创建解决方案。

控制器

ModelState.AddModelError("Code", "Invalid Code"); 

VIEW

@Html.CustomValidationMessage("Code") 

延长

public static class Extensions 
{ 
    public static MvcHtmlString CustomValidationMessage(this HtmlHelper htmlHelper, string modelName) 
    { 
     var modelState = htmlHelper.ViewData.ModelState[modelName]; 
     var modelErrors = modelState == null ? null : modelState.Errors; 
     var modelError = ((modelErrors == null) || (modelErrors.Count == 0)) 
      ? null 
      : modelErrors.FirstOrDefault(e => !string.IsNullOrEmpty(e.ErrorMessage)) ?? modelErrors[0]; 

     if (modelError != null) 
     { 
      return MvcHtmlString.Create("<span class='validation_wrapper customValidation'><span>" + modelError.ErrorMessage +"</span></span>"); 
     } 

     return new MvcHtmlString(string.Empty); 
    } 
} 
+0

你看到[这](http://stackoverflow.com/questions/5410665/custom-validationformessage-helper-removing -CSS元件/ 5412346#5412346)? – 2013-02-27 12:34:18

回答

4

有没有办法修改由ValidationMessageFor助手生成的标记。如果你想这样做,你将不得不写一个自定义的帮手。下面是这个助手的签名怎么可能是这样的:

public static MvcHtmlString CustomValidationMessageFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expression 
) 
{ 
    ... 
} 

您还可以检出similar post

+0

正是我需要的。谢谢! – Owen 2013-02-28 11:39:44

+0

您可以稍微修改标记。我在下面更新了我的答案。 – 2017-11-21 18:55:03

1

真的不需要自定义的扩展。例如:

控制器:

ModelState.AddModelError("InvalidLogin", "Your credentials are invalid.") 

查看:

@Html.ValidationMessageFor 
(
    model => model.InvalidLogin, 
    "", 
    htmlAttributes: new { @class = "text-error" }, 
    tag: "div" 
) 
+1

是的,如果你只有一个验证信息,但如果你有几个验证信息,你会把每个信息包装在一个范围内吗? – Owen 2014-01-29 10:31:41

+0

是的。除非你有一些复杂的标记。然而,大多数情况下,一个div或者一个自定义类的跨度可以做到这一点。 – 2017-11-21 18:52:29