Как я использую MVC ValidationMessage ASP.NET Помощник HTML в моем собственном помощнике?

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

Если адрес пользователя находится в Северной Америке, то я хочу, чтобы два текстовых поля были отображены для входа номера телефона, один для кода области и другого для остатка от числа. Если адрес за пределами Северной Америки, то я хочу, чтобы было отображено единственное текстовое поле для полного числа.

Следующий код работал, как предназначено на вывод полей правильного текста, однако, как только я добавил проверку, связанную с каждым текстовым полем, я теперь бросал NullReferenceException от ToString (), обращаются к вызову Помощника ValidationMessage (Помощник ValidationMessage возвращает пустой указатель!!).

public static string TelephoneNumberInputListItem(this HtmlHelper helper,
                                         string country,
                                         string northAmericanAreaCodeFormName,
                                         string northAmericanAreaCode,
                                         string northAmericanRemainingNumberFormName,
                                         string northAmericanRemainingNumber,
                                         string internationalFullNumberFormName,
                                         string internationalFullNumber)
    {

        //set up the error message and styling
        object errorHtmlAttributes = new { @class = "fError" };
        string validationMessage = "*";

        object htmlAttributes;

        //start building our list item tag which includes our telephone number 
        //input and validation controls
        TagBuilder listItemBuilder = new TagBuilder("li");

        //determine based on the country specified if this should be a North 
        //American phone input form or an international one
        if (isNorthAmericanCountry(country))
        {
            //add the text input controls
            htmlAttributes = new { size = 3, maxlength = 3 };
            listItemBuilder.InnerHtml = helper.TextBox(northAmericanAreaCodeFormName, northAmericanAreaCode, htmlAttributes).ToString();

            htmlAttributes = new { size = 7, maxlength = 7 };
            listItemBuilder.InnerHtml += helper.TextBox(northAmericanRemainingNumberFormName, northAmericanRemainingNumber, htmlAttributes).ToString();

            //Add the Validation Message controls
            listItemBuilder.InnerHtml += helper.ValidationMessage(northAmericanAreaCodeFormName, validationMessage, errorHtmlAttributes).ToString();
            listItemBuilder.InnerHtml += helper.ValidationMessage(northAmericanRemainingNumberFormName, validationMessage, errorHtmlAttributes).ToString();
        }
        else
        {
            //add the text input control
            htmlAttributes = new { size = 15, maxlength = 15 };
            listItemBuilder.InnerHtml = helper.TextBox(internationalFullNumberFormName, internationalFullNumber, htmlAttributes).ToString();

            //Add the Validation Message control
            listItemBuilder.InnerHtml += helper.ValidationMessage(internationalFullNumberFormName, validationMessage, errorHtmlAttributes).ToString();
        }

        return listItemBuilder.ToString(TagRenderMode.Normal);
    }

Можно ли помочь мне добавить проверку так, чтобы эти входные текстовые поля были все еще частью полной проверки формы, происходящей в Представлении вызова? Я должен упомянуть, что помещение Помощника TextBox и ValidationMessage непосредственно в Представлении работает правильно.

Существует много шума для использования Помощников HTML ("если существует, ЕСЛИ, используйте помощника" кто-либо?), но как мы, как предполагается, используем их, если мы не можем добавить средства управления проверкой к элементам управления вводом, мы используем.

Заранее спасибо за помощь.

5
задан Jason Berkan 17 December 2009 в 17:09
поделиться

1 ответ

Вспомогательная функция ValidationMessage возвращает значение null, если в соответствующем состоянии модели не указана ошибка. См. Фактический код ниже ...

Поскольку помощник ValidationMessage возвращает строку, нет причин для вызова ToString () (что и вызывает исключение). Удалите ToString, и ваш код должен работать должным образом.

Вы также можете удалить свои вызовы ToString из помощников TextBox.

public static string ValidationMessage(this HtmlHelper htmlHelper, string modelName, string validationMessage, IDictionary<string, object> htmlAttributes) {
  if (modelName == null) {
    throw new ArgumentNullException("modelName");
  }

  if (!htmlHelper.ViewData.ModelState.ContainsKey(modelName)) {
    return null;
  }

  ModelState modelState = htmlHelper.ViewData.ModelState[modelName];
  ModelErrorCollection modelErrors = (modelState == null) ? null : modelState.Errors;
  ModelError modelError = ((modelErrors == null) || (modelErrors.Count == 0)) ? null : modelErrors[0];

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

  TagBuilder builder = new TagBuilder("span");
  builder.MergeAttributes(htmlAttributes);
  builder.MergeAttribute("class", HtmlHelper.ValidationMessageCssClassName);
  builder.SetInnerText(String.IsNullOrEmpty(validationMessage) ? GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, modelState) : validationMessage);

  return builder.ToString(TagRenderMode.Normal);
}
4
ответ дан 15 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: