Подтвердить что ты не робот

ASP.NET MVC 3 пользовательских помощников HTML - лучшие практики/использование

Новое для MVC и выполнялось через учебники на веб-сайте asp.net.

Они включают пример пользовательского html-помощника для усечения длинного текста, отображаемого в таблице.

Просто интересно, какие другие решения люди придумали с помощью HTML-помощников и если есть какие-либо рекомендации или вещи, которых следует избегать при их создании/использовании.

В качестве примера я рассматривал возможность создания пользовательского помощника для форматирования дат, которые мне нужно отображать в разных местах, но теперь я обеспокоен тем, что может быть более элегантное решение (I.E. DataAnnotations в моих моделях)

Любые мысли?

EDIT:

Еще одно потенциальное использование, о котором я только думал... String concatenation. Пользовательский помощник может принимать идентификатор пользователя в качестве ввода и возвращать полное имя пользователя... Результатом может быть некоторая форма (Title) (First) (Middle) (Last) в зависимости от того, какое из этих полей доступно. Просто мысль, я еще не пробовал ничего подобного.

4b9b3361

Ответ 1

Ну а в случае форматирования атрибут DisplayFormat может быть хорошим решением:

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime Date { get; set; }

а затем просто:

@Html.DisplayFor(x => x.Date)

Что касается обрезающей строки, то удобный HTML-помощник является хорошим решением.


UPDATE:

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

public class PersonViewModel
{
    public string FullName { get; set; }
}

Теперь контроллер собирается запросить репозиторий для извлечения модели и затем сопоставить эту модель с моделью представления, которая будет передана в представление, чтобы представление могло просто @Html.DisplayFor(x => x.FullName). Сопоставление между моделями и моделями просмотра может быть упрощено с помощью таких фреймворков, как AutoMapper.

Ответ 2

Я использую HtmlHelpers все время, чаще всего для инкапсуляции генерации HTML шаблона, если я передумаю. У меня были такие помощники, как:

  • Html.BodyId(): генерирует обычный тег id тела для ссылки при добавлении пользовательского css для представления.
  • Html.SubmitButton(string): генерирует либо элемент ввода [type = submit], либо элемент [type = submit], в зависимости от того, как я хочу стилить кнопки.
  • Html.Pager(IPagedList): для создания элементов управления поискового вызова из модели постраничного списка.
  • и т.д.

Одним из моих любимых применений для HtmlHelpers является DRY для разметки общей формы. Обычно у меня есть контейнер div для строки формы, один div для метки и один ярлык для ввода, сообщения проверки, текст подсказки и т.д. В конечном итоге это может быть большим количеством шаблонов html-шаблонов. Ниже приведен пример того, как я справился с этим:

public static MvcHtmlString FormLineDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string labelText = null, string customHelpText = null, object htmlAttributes = null)
{
    return FormLine(
        helper.LabelFor(expression, labelText).ToString() +
        helper.HelpTextFor(expression, customHelpText),
        helper.DropDownListFor(expression, selectList, htmlAttributes).ToString() +
        helper.ValidationMessageFor(expression));
}

public static MvcHtmlString FormLineEditorFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string templateName = null, string labelText = null, string customHelpText = null, object htmlAttributes = null)
{
    return FormLine(
        helper.LabelFor(expression, labelText).ToString() +
        helper.HelpTextFor(expression, customHelpText),
        helper.EditorFor(expression, templateName, htmlAttributes).ToString() +
        helper.ValidationMessageFor(expression));
}

private static MvcHtmlString FormLine(string labelContent, string fieldContent, object htmlAttributes = null)
{
    var editorLabel = new TagBuilder("div");
    editorLabel.AddCssClass("editor-label");
    editorLabel.InnerHtml += labelContent;

    var editorField = new TagBuilder("div");
    editorField.AddCssClass("editor-field");
    editorField.InnerHtml += fieldContent;

    var container = new TagBuilder("div");
    if (htmlAttributes != null)
        container.MergeAttributes(new RouteValueDictionary(htmlAttributes));
    container.AddCssClass("form-line");
    container.InnerHtml += editorLabel;
    container.InnerHtml += editorField;

    return MvcHtmlString.Create(container.ToString());
}

public static MvcHtmlString HelpTextFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string customText = null)
{
    // Can do all sorts of things here -- eg: reflect over attributes and add hints, etc...
}    

Как только вы это сделали, вы можете вывести строки формы следующим образом:

<%: Html.FormLineEditorFor(model => model.Property1) %>
<%: Html.FormLineEditorFor(model => model.Property2) %>
<%: Html.FormLineEditorFor(model => model.Property3) %>

... и BAM, все ваши ярлыки, входы, подсказки и валидационные сообщения находятся на вашей странице. Опять же, вы можете использовать атрибуты на своих моделях и отражать их, чтобы получить действительно умные и сухие. И, конечно, это будет пустой тратой времени, если вы не сможете стандартизировать свой дизайн формы. Однако для простых случаев, когда css может предоставить всю необходимую вам настройку, он работает grrrrrrrrreat!

Мораль истории - HtmlHelpers могут изолировать вас от глобальных изменений дизайна, разрушающих разметку вручную, после просмотра. Они мне нравятся. Но вы можете пойти за борт, а иногда частичные представления лучше, чем кодированные помощники. Общее правило, которое я использую для выбора между вспомогательным и частичным представлением: если кусок HTML требует много условной логики или кодировки, я использую хелпер (введите код, где должен быть код); если нет, если я просто выводю общую разметку без большой логики, я использую частичный вид (пометьте разметку, где должна быть разметка).

Надеюсь, это даст вам некоторые идеи!