EditorFor игнорирует tabindex. Как вы устанавливаете tabindex? - PullRequest
4 голосов
/ 17 февраля 2011

Использование tabindex, кажется, работает только для htmlhelpers, таких как Textboxfor, но не для EditorFor

Например;

<%: Html.TextBoxFor(model => Model.MyItem, new { @tabindex = "3" })%>

Создает значение tabindex.

Однако, если вы используете;

<%: Html.EditorFor(model => Model.MyItem, new { @tabindex = "3" })%>

Тогда получается, что элемент управления создан, как и ожидалось, но индекс табуляции отсутствует.

Итак ...... Как можно установить tabindex для данного элемента управления EditorFor?

Ответы [ 2 ]

3 голосов
/ 18 февраля 2011

Основная проблема, с которой я столкнулся, заключалась в том, что мне нужно было создать механизм типа EditorFor, чтобы отформатировать десятичное число как валюту (наша система имеет несколько валют, поэтому «C» было бы неуместно), чтобы работал индекс табуляции И разрешить системе поддерживать стандартную валидацию.

Мне удалось добиться этого, используя следующее. Создавая свой собственный редактор управления.

Создайте файл (мой называется decimal.ascx) в каталоге Views / Shared / EditorTemplates вашего проекта.

 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<decimal?>" %>
 <% int intTabindex = 0;
   decimal myVal = 0;

   string strModelValue = "";
   if (Model != null)
   {
       myVal = (decimal)Model;
       strModelValue = myVal.ToString("#.00");
   }
   else
       strModelValue = "";



   if (ViewData["tabindex"] != null)
   {
       intTabindex = (int)ViewData["tabindex"];
   }
 %>
 <%: Html.TextBox("", strModelValue, new { @tabindex = intTabindex })%>

По сути, этот код просто переопределяет то, что обычно представляется в "десятичном" методе EditorFor;

<%: Html.TextBox("", Model.ToString("#.00"), new { @tabindex = intTabindex }) %>

шаблон.

Мой код вызова теперь читается;

<%: Html.EditorFor(model => Model.MyItem, new { tabindex = 5 })%>

Результат - следующий код на странице.

<input id="Model_MyItem" name="Model.MyItem" tabindex="5" type="text" value="12.33" />

Именно это я и требовал.

Хотя это справедливо только для моих конкретных обстоятельств, я бы посоветовал всем, кто хочет решить эту проблему, сначала попробовать пользовательский элемент управления для этой задачи, поскольку это может сэкономить вам значительное количество времени.

Если, конечно, в коде возможно создать требуемый тип элемента управления и скорректировать результаты в соответствии с этим.

Например; мы могли бы просто добавить еще один элемент в вызов, чтобы определить формат текста.

new {tabindex = 12, numberformat=2}

Затем просто создайте обработчик для всех форматов.

1 голос
/ 17 февраля 2011

Поскольку EditorFor является просто шаблоном для DataType, он ожидает только тип данных в качестве модели. Я думаю, есть несколько способов сделать это. Вы можете добавить tabindex к анонимному объекту, который будет объединен с ViewData для EditorTemplate следующим образом.

Код в вашем представлении:

Html.EditorFor(m => m.Username, "test", new { tabindex = 3, style = "width: 400px;" })

Проверка шаблона EditorForModel для ViewData:

<%: Html.TextBoxFor(m => m.Username, ViewData)%>

Это должно сделать текстовый ввод с tabindex 3 и style = "width: 400px;"

Удачного кодирования.

Отредактировано: Вот точная разметка, которая у меня есть внутри моей тестовой страницы:

<%: Html.EditorFor(m => m.DollarsAmount, "NullableDecimal", new { tabindex = 99 }) %>

Я говорю шаблону EditorFor, чтобы выбрать созданный мной шаблон Editor «NullableDecimal». (Вы можете поместить атрибут UiHint в свойство внутри модели, чтобы сообщить ему, какой шаблон шаблона использовать)

Шаблон редактора "NullableDecimal", расположенный в ~ / Views / Shared / EditorTemplates:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<decimal?>" %>

<%: Html.TextBox(string.Empty, (Model.HasValue ? Model.Value.ToString("#.00") : null), ViewData) %>

Что еще более расширяет мою реализацию, так это дополнительные ViewData, которые я передаю через мой анонимный объект, объединяются в словарь ViewData для использования EditorTemplate. Так что, если вы не передадите какие-либо ViewData в EditorTemplate, тогда он не будет отображать ваши текстовые вводы tabindex в 0, как ваша реализация в настоящее время сделает. Кроме того, ваша реализация будет учитывать только табличные индексы, а не любые другие входные атрибуты. то есть максимальная длина или стиль

...