Я пытаюсь создать пользовательского Помощника 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 ("если существует, ЕСЛИ, используйте помощника" кто-либо?), но как мы, как предполагается, используем их, если мы не можем добавить средства управления проверкой к элементам управления вводом, мы используем.
Заранее спасибо за помощь.
Вспомогательная функция 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);
}