Объединение нескольких строго типизированных помощников HTML

Код в моем представлении бритвы (MVC 5) повторяется со следующим шаблоном, таким как FirstName, LastName, ShortName и т. Д. Мне интересно, можно ли инкапсулировать в один помощник HTML, который может принимать строго типизированное лямбда-выражение и генерировать следующее HTML для меня?

@Html.TextBoxFor(m => m.FirstName, new { @class = "validate" })
@Html.LabelFor(m => m.FirstName)
<span class="red-text">
    @Html.ValidationMessageFor(m => m.FirstName)
</span>

@Html.TextBoxFor(m => m.LastName, new { @class = "validate" })
@Html.LabelFor(m => m.LastName)
<span class="red-text">
    @Html.ValidationMessageFor(m => m.LastName)
</span>

@Html.TextBoxFor(m => m.ShortName, new { @class = "validate" })
@Html.LabelFor(m => m.ShortName)
<span class="red-text">
    @Html.ValidationMessageFor(m => m.ShortName)
</span>

В идеале хотелось бы написать:

@Html.DisplayTextBox(m => m.FirstName)
@Html.DisplayTextBox(m => m.LastName)
@Html.DisplayTextBox(m => m.ShortName)

Думаю, этого можно достичь, но не знаю как? Я надеюсь, что кто-нибудь может мне помочь или указать на ресурс, где я могу прочитать и написать код?

Я не хочу зависеть от EditorTemplate, потому что хочу контролировать формат формы.


person Coder Absolute    schedule 20.10.2015    source источник
comment
Да, вы можете создать свой собственный метод расширения HtmlHelper для вывода любого HTML-кода, который вы хотите   -  person    schedule 20.10.2015
comment
Да, я знаю, что это возможно. Я новичок в MVC, не могли бы вы дать мне какую-нибудь ссылку для начала?   -  person Coder Absolute    schedule 20.10.2015
comment
Заранее спасибо! знак равно   -  person Coder Absolute    schedule 20.10.2015


Ответы (1)


Вы можете создать свои собственные методы расширения HtmlHelper для генерации комбинированного вывода. Следующее создаст html ваш после

using System;
using System.Linq.Expressions;
using System.Text;
using System.Web.Mvc;
using System.Web.Mvc.Html;

namespace YourAssembly.Html
{
  public static class MyHelpers
  {
    public static MvcHtmlString DisplayTextBoxFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
    {      
      MvcHtmlString label = LabelExtensions.LabelFor(helper, expression);
      MvcHtmlString textbox = InputExtensions.TextBoxFor(helper, expression, new { @class = "validate" });
      MvcHtmlString validation = ValidationExtensions.ValidationMessageFor(helper, expression);
      StringBuilder html = new StringBuilder();
      html.Append(textbox);
      html.Append(label);
      TagBuilder span = new TagBuilder("span");
      span.AddCssClass("red-text");
      span.InnerHtml = validation.ToString();
      html.Append(span.ToString());
      return MvcHtmlString.Create(html.ToString());
    }
  }
}

Затем вы можете сделать его доступным во всех ваших представлениях, добавив его в web.config

<system.web.webPages.razor>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="System.Web.Mvc" />
      ....
      <add namespace="YourAssembly.Html" />
    </namespaces>
person Community    schedule 20.10.2015
comment
Это работает как шарм! Я пробовал аналогичный код ранее из какой-то статьи, но это не сработало, потому что Func ‹› упоминается в System и Antlr.Runtime.Misc, поэтому ошибка возникает неоднозначно! Используя ваш фрагмент, мне удалось это выяснить и удалить ссылку на Antlr.Runtime.Misc. Думаю, стоит упомянуть, это может помочь другим. Спасибо, Стивен! - person Coder Absolute; 20.10.2015
comment
Прекрасный. Это как раз то, что я искал. Я знаю, что вряд ли получу ответ, но можно ли включить переопределения в текст для них? Я использую CMS, поэтому все мои формы содержат значения, вводимые пользователем для меток и ошибок. Итак, я бы использовал: @ Html.ValidationMessageFor (m = ›m.LastName, какое-то сообщение об ошибке, введенное пользователем). Можно ли это сделать? - person Tony Kiernan; 26.04.2018
comment
@TonyKiernan. Конечно, вы бы просто включили для них дополнительные параметры в метод - person ; 27.04.2018
comment
Да, я так и думал. Но когда я попробовал общедоступный статический MvcHtmlString DisplayTextBoxFor ‹TModel, TValue› (этот помощник HtmlHelper ‹TModel›, Expression ‹Func‹ TModel, выражение TValue ››, строка myAlert) myAlert всегда был пустым, даже когда я жестко закодировал значение. - person Tony Kiernan; 10.05.2018
comment
@TonyKiernan, нормально бы сработало. Не видя вашего кода, я не могу сказать, в чем вы ошибаетесь, поэтому предлагаю вам задать новый вопрос с подробностями. - person ; 10.05.2018
comment
Хорошо спасибо. Сделаю это. Надеюсь, у меня будет возможность взглянуть на него еще раз на этой неделе - person Tony Kiernan; 10.05.2018