16

我正在测试 null 的事物列表。每次我找到一个时,我都会将它保存在一个数组中以在验证消息中实现它。

我想要的输出如下所示:

字段 1 是必需的
字段 4 是必需的
等等...

但我似乎无法开始新的生产线。

现在,它看起来像这样:

字段 1 为必填项 字段 4 为必填项

有谁知道如何实现这一目标?

编辑:

控制器:

IDictionary<int, String> emptyFields = new Dictionary<int, String>();

foreach (Something thing in AnotherThing.Collection)
{
    if (thing.Property == null)
        emptyFields.add(thing.Index, thing.Name);                   
}

if (emptyFields.Any())
    throw new CustomException() { EmptyFields = emptyFields };

这个异常在这里处理:

catch (CustomException ex)
{                   
    ModelState.AddModelError("file", ex.GetExceptionString());
    return View("theView");
}    

自定义异常:

public class CustomException: Exception
{
    public IDictionary<int,String> EmptyFields { get; set; }
    public override String Label { get { return "someLabel"; } }
    public override String GetExceptionString()
    {
        String msg = "";
        foreach (KeyValuePair<int,String> elem in EmptyFields)
        {
            msg += "row: " + (elem.Key + 1).ToString() + " column: " + elem.Value + "<br/>";      
        }
        return msg;        
    }
}

看法:

<span style="color: #FF0000">@Html.Raw(Html.ValidationMessage("file").ToString())</span>
4

7 回答 7

19

你可以用这一个班轮做到这一点:

@Html.Raw(HttpUtility.HtmlDecode(Html.ValidationMessageFor(m => m.Property).ToHtmlString()))
于 2013-10-01T21:08:48.563 回答
8

您将需要编写一个自定义助手来实现这一点。内置ValidationMessageFor帮助器自动对值进行 HTML 编码。这是一个例子:

public static class ValidationMessageExtensions
{
    public static IHtmlString MyValidationMessageFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper, 
        Expression<Func<TModel, TProperty>> ex
    )
    {
        var htmlAttributes = new RouteValueDictionary();
        string validationMessage = null;
        var expression = ExpressionHelper.GetExpressionText(ex);
        var modelName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expression);
        var formContext = htmlHelper.ViewContext.ClientValidationEnabled ? htmlHelper.ViewContext.FormContext : null;
        if (!htmlHelper.ViewData.ModelState.ContainsKey(modelName) && formContext == null)
        {
            return null;
        }

        var modelState = htmlHelper.ViewData.ModelState[modelName];
        var modelErrors = (modelState == null) ? null : modelState.Errors;
        var modelError = (((modelErrors == null) || (modelErrors.Count == 0)) 
            ? null 
            : modelErrors.FirstOrDefault(m => !String.IsNullOrEmpty(m.ErrorMessage)) ?? modelErrors[0]);

        if (modelError == null && formContext == null)
        {
            return null;
        }

        var builder = new TagBuilder("span");
        builder.MergeAttributes(htmlAttributes);
        builder.AddCssClass((modelError != null) ? HtmlHelper.ValidationMessageCssClassName : HtmlHelper.ValidationMessageValidCssClassName);

        if (!String.IsNullOrEmpty(validationMessage))
        {
            builder.InnerHtml = validationMessage;
        }
        else if (modelError != null)
        {
            builder.InnerHtml = GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, modelState);
        }

        if (formContext != null)
        {
            bool replaceValidationMessageContents = String.IsNullOrEmpty(validationMessage);
            builder.MergeAttribute("data-valmsg-for", modelName);
            builder.MergeAttribute("data-valmsg-replace", replaceValidationMessageContents.ToString().ToLowerInvariant());
        }

        return new HtmlString(builder.ToString(TagRenderMode.Normal));
    }

    private static string GetUserErrorMessageOrDefault(HttpContextBase httpContext, ModelError error, ModelState modelState)
    {
        if (!String.IsNullOrEmpty(error.ErrorMessage))
        {
            return error.ErrorMessage;
        }
        if (modelState == null)
        {
            return null;
        }

        var attemptedValue = (modelState.Value != null) ? modelState.Value.AttemptedValue : null;
        return string.Format(CultureInfo.CurrentCulture, "Value '{0}' not valid for property", attemptedValue);
    }
}

进而:

public class MyViewModel
{
    [Required(ErrorMessage = "Error Line1<br/>Error Line2")]
    public string SomeProperty { get; set; }
}

在视图中:

@model MyViewModel
@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.SomeProperty)
    @Html.MyValidationMessageFor(x => x.SomeProperty)
    <button type="submit">OK</button>
}

如果您想在 ValidationSummary 中显示错误消息,您还可以编写一个自定义帮助程序,它不会对错误消息进行 HTML 编码,如this post.

于 2012-10-16T07:50:34.243 回答
1

试试这个


在每条错误消息后附加标签并使用Html.Raw()方法显示您的内容 Html.Raw 将解码 HtmlContent。

you message like 
 Field 1 is required <br/>Field 4 is required<br/> 

In View

Html.Raw("Yore Error Message")
于 2012-10-16T07:34:54.837 回答
1

如果有人正在寻找它,以下是如何为验证摘要执行此操作:

@Html.Raw(HttpUtility.HtmlDecode(Html.ValidationSummary(true).ToHtmlString()))
于 2018-01-29T19:40:25.070 回答
0

您是否在验证摘要中显示它们?我认为它不支持用于换行等的 html。我会根据显示 html 的验证摘要创建一个自定义 html 助手。

这同样适用于验证消息,因此可能需要为此创建一个自定义助手

于 2012-10-16T07:45:05.797 回答
0

我所做的就是将它们放在一个 div 中

       <div class="Errors">

        @Html.ValidationMessageFor(m => m.Name)<br/>
        @Html.ValidationMessageFor(m => m.LName)<br />
      </div>

然后创建一个类

     .Errors {
          color: red;
          font-size: 10px;
          font-weight: bold;
          }

但是如果你想做一个多行错误,那么 Leinel 提到的是最好的方法。我把它们捆绑在一起的原因是一些用户不会看到长表单的错误,他们会开始给我们打电话.. ^^,

于 2016-09-15T18:51:18.760 回答
0

感谢我参加这个聚会有点晚了,但是刚刚遇到了这个问题并且使用普通的旧 css 也很有效:

<style>
    .field-validation-error::after {
        content: "\a";
        white-space: pre;
    }
</style>
于 2021-12-29T10:00:14.973 回答