EditorFor忽略tabindex。你如何设置tabindex?

时间:2011-02-17 11:30:30

标签: asp.net-mvc asp.net-mvc-2 html-helper tabindex editorfor

使用tabindex似乎只适用于像Textboxfor这样的htmlhelpers,而不适用于EditorFor

例如;

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

生成tabindex值。

但是,如果你使用;

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

然后结果是控件按预期创建,但tabindex缺失。

那么......如何为给定的EditorFor控件设置tabindex呢?

2 个答案:

答案 0 :(得分:3)

我遇到的主要问题是我需要创建一个EditorFor类型机制,以便像货币一样格式化小数(我们的系统有多种货币,所以“C”不合适),获得一个标签索引工作并允许系统维持标准验证。

我设法使用以下方法实现了这一目标。通过创建我自己的自定义编辑器控件。

在项目的Views / Shared / EditorTemplates目录中创建一个文件(我的名字叫decimal.ascx)。

 <%@ 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 :(得分:1)

由于EditorFor只是DataType的模板,因此只需要一个数据类型作为Model。我猜测有几种方法可以解决这个问题。您可以将tabindex添加到一个匿名对象,该对象将像这样合并到EditorTemplate的ViewData中。

您视图中的代码:

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模板选择我创建的“NullableDecimal”EditorTemplate。 (您可以在模型内部的属性上放置UiHint属性,以告诉它使用什么editortemplate)

“NullableDecimal”EditorTemplate位于〜/ 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,因为您的实现当前将执行此操作。此外,您的实现仅考虑tabindexes而不考虑任何其他输入属性。即maxlength或style