Asp.net mvc EditorFor忽略tabindex。如何设置选项卡索引?

Asp.net mvc EditorFor忽略tabindex。如何设置选项卡索引?,asp.net-mvc,asp.net-mvc-2,html-helper,tabindex,editorfor,Asp.net Mvc,Asp.net Mvc 2,Html Helper,Tabindex,Editorfor,tabindex的使用似乎只适用于Textboxfor等HTMLHelper,而不适用于EditorFor 比如, <%: Html.TextBoxFor(model => Model.MyItem, new { @tabindex = "3" })%> Model.MyItem,新的{@tabindex=“3”})%> 生成一个tabindex值 然而,如果你使用 <%: Html.EditorFor(model => Model.MyItem, new {

tabindex的使用似乎只适用于Textboxfor等HTMLHelper,而不适用于EditorFor

比如,

<%: Html.TextBoxFor(model => Model.MyItem, new { @tabindex = "3" })%>
Model.MyItem,新的{@tabindex=“3”})%>
生成一个tabindex值

然而,如果你使用

<%: Html.EditorFor(model => Model.MyItem, new { @tabindex = "3" })%>
Model.MyItem,新的{@tabindex=“3”})%>
然后,结果是按照预期创建了控件,但缺少tabindex


所以。。。。。。如何为给定的EditorFor控件设置tabindex?

因为EditorFor只是一个数据类型的模板,所以它只需要一个数据类型作为它的模型。我猜有几种方法可以解决这个问题。您可以将tabindex添加到匿名对象中,该匿名对象将被合并到EditorTemplate的ViewData中,如下所示

您视图中的代码:

Html.EditorFor(m => m.Username, "test", new { tabindex = 3, style = "width: 400px;" })
EditorForModel模板检查查看数据:

<%: Html.TextBoxFor(m => m.Username, ViewData)%>
m.用户名,视图数据)%>
这将呈现tabindex为3且style=“width:400px;”的文本输入

快乐编码

编辑: 以下是我在测试页面中的标记:

<%: Html.EditorFor(m => m.DollarsAmount, "NullableDecimal", new { tabindex = 99 }) %>
m.DollarsAmount,“NullableDecimal”,新的{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。另外,您的实现将只考虑tabindex,而不考虑任何其他输入属性。i、 e.maxlength或style

我遇到的主要问题是,我需要创建一个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 })%>

然后简单地为所有格式创建一个处理程序。

对不起,我的MVC安装可能有问题。但是,虽然它“应该”呈现为OK,但它没有。使用tabindex或@tabindex或=“3”或=3;我没有使用该控件呈现tabindex。在提交答案之前,您是否检查过这是否有效?我刚刚创建了一个全新的应用程序来测试我的理论,在我的安装中,至少我无法将tabindex添加到EditorFor控件。请创建一个新的MVC 2应用程序并编辑登录页面,如果添加新的{tabindex=3}并将TextBoxfor更改为Editor,请确认该tabindex显示在页面源中。非常感谢。是的,我在Asp.NETMVC2项目中测试了这段代码。匿名对象将只包含元素属性,这些属性将用于提供给接受html.TextBoxFor的IDictionary html属性的方法。我不确定为什么tabindex没有为您提供,因为我已经在Asp.net Mvc 2和3中使用我的EditorFor实现对其进行了测试,并且这已经起到了作用。我相信您知道,您可以使用UiHint属性将模板设置为查找model属性,或者通过在源代码中传递带有EditorFor调用的templatename。我的更具可扩展性,因为它将合并您想要呈现文本框的任何额外属性。+1知道这是一篇非常古老的文章,我想我会添加
@Html.EditorFor(model=>model.text,new{tabindex=“1”})
在MVC4中工作。看来他们已经按预期解决了这个问题。
<%: 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}