asp.net-mvc – 验证消息中的换行符

我正在测试一个事情的列表为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");
}

CustomException:

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>

解决方法

您将需要编写一个自定义帮助器来实现.内置的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中显示错误消息,您还可以编写一个自定义帮助器,不会像this post显示的那样对错误消息进行HTML编码.

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...