c# - 如何通过 C# 在 Html.ValidationSummary() 中获取 HTML 或换行符/回车符?

标签 c# asp.net-mvc asp.net-mvc-2

如果不编写一些我不打算做的疯狂扩展方法,这可能是不可能的。我知道 ValidationSummary()为安全而编码。 我只是好奇我是否遗漏了什么明显的……?

我有一个简单的 <%= Html.ValidationSummary() %>以我的形式。在某些情况下,会抛出错误,如果我能对错误的出现有更多的控制,那就太好了。

例如 - 当我导入 CSV 文件时,我向 ValidationSummary() 抛出以下错误如果 header 不是可接受的格式或包含特殊字符:

constraintValidatorContext.AddInvalid(invalidHeaders.Count() == 1
                        ? string.Format("The following column header is invalid: {0}.", badHeaders)
                        : string.Format("There were multiple invalid column headers including: {0}.", badHeaders), "General");

如果我能在列表中显示多个标题如下,那就太好了:

string.Format("There were multiple invalid column headers including: <li>{0}</li>", badHeaders)

这会显示 HTML。 即使我可以在这里或那里添加一个换行符,它也会有所帮助 (\n\r)...我只是不知道什么吗?

最佳答案

换行符在 HTML 中无效,您需要 <br />标签。

您始终可以自己滚动以更好地控制输出。这是该助手的 MVC2 源代码。它基本上看透了

public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors, string message, IDictionary<string, object> htmlAttributes) {
        if (htmlHelper == null) {
            throw new ArgumentNullException("htmlHelper");
        }

        FormContext formContext = htmlHelper.ViewContext.GetFormContextForClientValidation();
        if (formContext == null && htmlHelper.ViewData.ModelState.IsValid) {
            return null;
        }

        string messageSpan;
        if (!String.IsNullOrEmpty(message)) {
            TagBuilder spanTag = new TagBuilder("span");
            spanTag.SetInnerText(message);
            messageSpan = spanTag.ToString(TagRenderMode.Normal) + Environment.NewLine;
        }
        else {
            messageSpan = null;
        }

        StringBuilder htmlSummary = new StringBuilder();
        TagBuilder unorderedList = new TagBuilder("ul");

        IEnumerable<ModelState> modelStates = null;
        if (excludePropertyErrors) {
            ModelState ms;
            htmlHelper.ViewData.ModelState.TryGetValue(htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix, out ms);
            if (ms != null) {
                modelStates = new ModelState[] { ms };
            }
        }
        else {
            modelStates = htmlHelper.ViewData.ModelState.Values;
        }

        if (modelStates != null) {
            foreach (ModelState modelState in modelStates) {
                foreach (ModelError modelError in modelState.Errors) {
                    string errorText = GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, null /* modelState */);
                    if (!String.IsNullOrEmpty(errorText)) {
                        TagBuilder listItem = new TagBuilder("li");
                        listItem.SetInnerText(errorText);
                        htmlSummary.AppendLine(listItem.ToString(TagRenderMode.Normal));
                    }
                }
            }
        }

        if (htmlSummary.Length == 0) {
            htmlSummary.AppendLine(_hiddenListItem);
        }

        unorderedList.InnerHtml = htmlSummary.ToString();

        TagBuilder divBuilder = new TagBuilder("div");
        divBuilder.MergeAttributes(htmlAttributes);
        divBuilder.AddCssClass((htmlHelper.ViewData.ModelState.IsValid) ? HtmlHelper.ValidationSummaryValidCssClassName : HtmlHelper.ValidationSummaryCssClassName);
        divBuilder.InnerHtml = messageSpan + unorderedList.ToString(TagRenderMode.Normal);

        if (formContext != null) {
            // client val summaries need an ID
            divBuilder.GenerateId("validationSummary");
            formContext.ValidationSummaryId = divBuilder.Attributes["id"];
            formContext.ReplaceValidationSummary = !excludePropertyErrors;
        }
        return divBuilder.ToMvcHtmlString(TagRenderMode.Normal);
    }

ValidationSummaryValidCssClassName 是“validation-summary-errors”,ValidationSummaryValidCssClassName 是“validation-summary-valid”。

关于c# - 如何通过 C# 在 Html.ValidationSummary() 中获取 HTML 或换行符/回车符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5595218/

相关文章:

asp.net - .NET MVC2 Master 上的多个部分 View ,也可通过 AJAX 单独加载

c# - 如何在C#中获取主板传感器读数

C# 定时器间隔每 24 小时

c# - 在 Visual Studio 中更新 Web 引用

c# - 如何从 Web.config 获取常量字符串?

asp.net - 上下文菜单没有 "Add Scaffolding"和 "Add Controller"选项

asp.net-mvc - ASP.NET MVC : Why can't I set ShowForEdit model metadata with an attribute?

c# - 使用 C# 的先到先服务 (FCFS) CPU 调度错误

javascript - ViewData 未通过 Jquery 显示

c# - TextBoxFor 呈现为带有 ID 属性前缀的 HTML