ASP.NET MVC 3 пользовательских помощников HTML - лучшие практики/использование
Новое для MVC и выполнялось через учебники на веб-сайте asp.net.
Они включают пример пользовательского html-помощника для усечения длинного текста, отображаемого в таблице.
Просто интересно, какие другие решения люди придумали с помощью HTML-помощников и если есть какие-либо рекомендации или вещи, которых следует избегать при их создании/использовании.
В качестве примера я рассматривал возможность создания пользовательского помощника для форматирования дат, которые мне нужно отображать в разных местах, но теперь я обеспокоен тем, что может быть более элегантное решение (I.E. DataAnnotations в моих моделях)
Любые мысли?
EDIT:
Еще одно потенциальное использование, о котором я только думал... String concatenation.
Пользовательский помощник может принимать идентификатор пользователя в качестве ввода и возвращать полное имя пользователя...
Результатом может быть некоторая форма (Title) (First) (Middle) (Last) в зависимости от того, какое из этих полей доступно. Просто мысль, я еще не пробовал ничего подобного.
Ответы
Ответ 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 требует много условной логики или кодировки, я использую хелпер (введите код, где должен быть код); если нет, если я просто выводю общую разметку без большой логики, я использую частичный вид (пометьте разметку, где должна быть разметка).
Надеюсь, это даст вам некоторые идеи!