2011-02-17 102 views
4

tabindex的使用似乎只适用于HTMLhelpers,如Textboxfor而非EditorForEditorFor忽略tabindex。你如何设置tabindex?

例如;

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

产生一个tabindex值。

但是,如果您使用;

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

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

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

+0

对我来说好像是一个bug – Alex 2011-10-26 15:25:43

回答

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 })%> 

从本质上讲,这段代码只是覆盖了通常在“decimal”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

由于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)%> 

这应该渲染的3 tabindex属性和样式的文本输入= “宽度:400像素;”

快乐编码。

编辑: 这里是完全标记我有我的测试页面里面:

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

我说的是EditorFor模板选择,我创建了“NullableDecimal” EditorTemplate。 (你可以放置一个UiHint属性在模型内的财产也告诉它使用什么editortemplate)

“NullableDecimal” EditorTemplate位于〜/查看/共享/ EditorTemplates:

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

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

更重要的是可扩展的关于我的实现是我通过匿名对象传入的额外ViewData被合并到ViewTool字典中供EditorTemplate使用。因此,如果您没有将任何ViewData传递给EditorTemplate,那么它将不会将您的文本输入tabindex呈现为0,因为您的实现目前会这样做。另外,您的实现只会解决tabindexes问题,而不能解决任何其他输入属性问题。即最大长度或风格

+0

对不起,也许我的MVC安装有些不妥。但是,当它“应该”呈现OK时,它不会。使用tabindex或@tabindex或=“3”或= 3;我没有得到与控件呈现的tabindex。你提交答案之前是否检查过它是否有效? – RobLeather 2011-02-18 11:57:55