Конфликт с @Html.LabelFor и валидатором W3C?

#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!