#asp.net #asp.net-mvc #html-helper
#asp.net #asp.net-mvc #html-помощник
Вопрос:
У меня есть модель, которую я использую для представления индекса модели из базы данных, и я присвоил отображаемое имя некоторым строкам, в которых могут потребоваться пробелы (т.Е. «weekstarting» в базе данных будет присвоено отображаемое имя «Weekstarting»).
Итак, я установил отображаемое имя для моей модели следующим образом:
[DisplayName("Week Starting")]
public DateTime WeekStarting { get; set; }
и затем в заголовках таблицы для моей таблицы я использую следующую строку кода для отображения имени поля, используя его заданное отображаемое имя:
@Html.LabelFor(x => x.First().WeekStarting)
Все вышеперечисленное работает нормально. Но я использую валидатор W3C, и он выдает мне следующую ошибку для примера, который я привел:
Атрибут for элемента label должен ссылаться на элемент управления form.
Простите меня, если это очевидно, но что я здесь делаю не так? Я не использую форму, я просто отображаю индекс элементов в таблице. Я пытался найти ответ и увидел, что кто-то предположил, что элементы управления формой, на которые ссылаются, нуждаются в идентификаторах (хотя я не использую форму), но это было бы неприменимо в данном случае, потому что, если бы я попытался установить идентификатор в индексе, он был бы продублирован с каждым элементом в индексе:
foreach (var item in Model.Tbms)
{
<tr><td>@item.value</td><tr>.... would be repeated for each item, and also unsure where I would put the id in any case, the td?
}
Или есть лучший способ пометить заголовок поля, в первую очередь моим предпочтительным отображаемым именем? Думаю, я мог бы просто поменять местами @Html.LabelFor … для имени поля жесткого кода, но обязательно ли это?
Ответ №1:
Это вставка label
элемента, который должен соответствовать допустимому вводу на странице. Вы можете (а) либо не беспокоиться об этом, (б) выводить текст напрямую, не используя LabelFor
, (в) написать пользовательский помощник, который извлекает текст метки из модели, не оборачивая его в label
, или (г) развернуть его с помощью javascript на клиенте (что позволит ему пройти проверку, но только после запуска скрипта).
Вот расширение, основанное на коде LabelFor, которое должно помочь с (c). Непроверено.
public static class HelperExtensions
{
public static MvcHtmlString TableHeaderFor<TModel,TValue)( this HtmlHelper<TModel> html, Expression<Func<TModel,TValue>> expression )
{
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
string headerText = metadata.DisplayName ?? metadata.PropertyName ?? ExpressionHelper.GetExpressionText(expression);
return new MvcHtmlString( headerText );
}
}
Комментарии:
1. Обратите внимание, что вы могли бы заставить его фактически сгенерировать
TH
, если хотите, что, я полагаю, было бы более уместно, учитывая имя. В этом случае вы бы просто использовали TagBuilder для созданияTH
и добавленияheaderText
в качестве внутреннего текста тега. Подпись, вероятно, потребуется изменить, чтобы она принимала атрибуты HTML, и тогда вам придется добавить код для обработки их. Смотрите исходный код MVC на codeplex.com/aspnet за идеи о том, как вы могли бы заставить это работать.
Ответ №2:
Это просто проблема случая? Ваша строка:
@Html.LabelFor(x => x.First().Weekstarting)
содержит ‘Weekstarting’, тогда как фактическое свойство называется ‘WeekStarting’.
Комментарии:
1. нет, извините, дело не в том, что я допустил ошибку при вводе кода сюда. Однако, хорошо замечено! 1!