Расширение ValidationSummary в HTMLHelper для изменения вывода HTML - PullRequest
0 голосов
/ 22 сентября 2011

Я написал свой собственный ValidationSummary, чтобы я мог изменить вывод ValidationSummary, однако всякий раз, когда я отправляю форму, никакие предупреждающие сообщения не появляются.

Затем я добавлял обычный ValidationSummary в том же виде с моим новым ValidationSummaryи когда страница первоначально запрашивается, вывод точно такой же.Как только нажата кнопка «отправить», работает нормальная и выводит сообщения об ошибках, а моя - нет.

Кажется, он не отправляет сообщение на сервер, поэтому я что-то упустил?

 public static MvcHtmlString MyValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors, string message, IDictionary<string, object> htmlAttributes)
        {
            //<div class="validation-summary-errors" data-valmsg-summary="true"><ul><li>The User name field is required.</li><li>The Password field is required.</li></ul></div>

            /*
             * <div class="alert-wrapper error">
                    <div class="alert-text">
                        This is an error alert!
                        <a href="#" class="close">Close</a>
                    </div>
                </div>
             * 
             */
            if (htmlHelper == null)
            {
                throw new ArgumentNullException("htmlHelper");
            }

            FormContext formContext = htmlHelper.ViewContext.FormContext;
            if (htmlHelper.ViewData.ModelState.IsValid)
            {
                if (formContext == null)
                {  // No client side validation
                    return null;
                }
                // TODO: This isn't really about unobtrusive; can we fix up non-unobtrusive to get rid of this, too?
                if (htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled && excludePropertyErrors)
                {  // No client-side updates
                    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(errorText);
                        }
                    }
                }
            }

            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);

            TagBuilder innerDivBuilder = new TagBuilder("div");
            innerDivBuilder.AddCssClass("alert-text");

            TagBuilder closeBuilder = new TagBuilder("a");
            closeBuilder.AddCssClass("close");
            closeBuilder.Attributes.Add("href", "#");

            divBuilder.InnerHtml = innerDivBuilder.InnerHtml + messageSpan + htmlSummary.ToString() + closeBuilder.InnerHtml; 

            if (formContext != null)
            {
                if (htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled)
                {
                    if (!excludePropertyErrors)
                    {  // Only put errors in the validation summary if they're supposed to be included there
                        divBuilder.MergeAttribute("data-valmsg-summary", "true");
                    }
                }
                else
                {
                    // client val summaries need an ID
                    divBuilder.GenerateId("validationSummary");
                    formContext.ValidationSummaryId = divBuilder.Attributes["id"];
                    formContext.ReplaceValidationSummary = !excludePropertyErrors;
                }
            }

            return new MvcHtmlString(divBuilder.ToString(TagRenderMode.Normal));
            //return divBuilder.ToMvcHtmlString(TagRenderMode.Normal);
        }

1 Ответ

0 голосов
/ 22 сентября 2011

Получается, что у вас должно быть <ul> в вашем ValidationSummary, а затем javascript добавляет <li> на клиентскую сторону, не являющуюся версткой, поэтому по сути вы не можете изменить HTML в ValidationSummary, если хотите, чтобы он работал на клиентской стороне беззатем изменив валидационный JavaScript, а также.

...