tabindex
タブ オーダーを設定するには、生成されたフィールドに追加の属性を追加できるようにするだけです。TextBoxFor
またはのようなものを使用すると、実際にはこの目的専用DropDownListFor
のパラメーターを実際に取るため、簡単です。htmlAttributes
@Html.TextBoxFor(m => m.Foo, new { tabindex = 1 })
以前は、同じことは言えませんでしたEditorFor
。これは「テンプレート化された」ヘルパーであるため、メソッド呼び出しではなくエディター テンプレートが生成されるものに影響します。これは の定義で確認できます。他EditorFor
のhtmlAttributes
ヘルパーのようなパラメーターはなく、additionalViewData
.
MVC 5.1 以降、Microsoft は追加の HTML 属性をEditorFor
、特別な名前のViewData
キーを介して に渡すことができるようにしました"htmlAttributes"
。その結果、 のようなものを使用した場合と同じことを達成できますがTextBoxFor
、もう少し冗長です。
@Html.EditorFor(m => m.Foo, new { htmlAttributes = new { tabindex = 1 } })
ほら、あなたはまだ実際にadditionalViewData
ここを通過していますが、その追加のビュー データには をキーとする無名オブジェクトが含まれていますhtmlAttributes
。組み込みのエディターテンプレートはViewData["htmlAttributes"]
、生成された要素に追加の属性を追加するために使用する方法を知っています。ただし、Microsoft はこれを使用するように特別にプログラムしているため、これは既定のエディター テンプレートにのみ適用されます。独自のカスタム エディター テンプレートを追加するとすぐに、最初の場所に戻ります。
カスタム エディター テンプレートを使用してこれにアプローチする方法はいくつかあります。まず、タブ インデックスをビュー データとして直接渡し、それをテンプレートで利用することができます。
@Html.EditorFor(m => m.Foo, new { tabindex = 1 })
次に、エディター テンプレートで次のようにします。
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { tabindex = ViewData["tabindex"]})
EditorFor
次に、デフォルトのテンプレートを使用して の動作を模倣できます。
@Html.EditorFor(m => m.Foo, new { htmlAttributes = new { tabindex = 1 } })
次に、エディター テンプレートで次のようにします。
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, ViewData["htmlAttributes"])
ただし、このオプションでは「デフォルト」属性を使用できません。これは、オール オア ナッシングのアプローチです。組み込みのエディター テンプレートと同じように真に利用できるようにするViewData["htmlAttributes"]
には、最初にデフォルトの属性を渡された属性と組み合わせてから、シバン全体を に渡す必要がありますhtmlAttributes
。それについて詳しく説明しているブログ投稿がありますが、TL;DR: 次の拡張機能が必要です。
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Web.Routing;
public static partial class HtmlHelperExtensions
{
public static IDictionary<string, object> MergeHtmlAttributes(this HtmlHelper helper, object htmlAttributesObject, object defaultHtmlAttributesObject)
{
var concatKeys = new string[] { "class" };
var htmlAttributesDict = htmlAttributesObject as IDictionary<string, object>;
var defaultHtmlAttributesDict = defaultHtmlAttributesObject as IDictionary<string, object>;
RouteValueDictionary htmlAttributes = (htmlAttributesDict != null)
? new RouteValueDictionary(htmlAttributesDict)
: HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributesObject);
RouteValueDictionary defaultHtmlAttributes = (defaultHtmlAttributesDict != null)
? new RouteValueDictionary(defaultHtmlAttributesDict)
: HtmlHelper.AnonymousObjectToHtmlAttributes(defaultHtmlAttributesObject);
foreach (var item in htmlAttributes)
{
if (concatKeys.Contains(item.Key))
{
defaultHtmlAttributes[item.Key] = (defaultHtmlAttributes[item.Key] != null)
? string.Format("{0} {1}", defaultHtmlAttributes[item.Key], item.Value)
: item.Value;
}
else
{
defaultHtmlAttributes[item.Key] = item.Value;
}
}
return defaultHtmlAttributes;
}
}
次に、カスタム エディター テンプレートの先頭に以下を追加する必要があります。
@{
var defaultHtmlAttributesObject = new { type = "date", @class = "form-control" };
var htmlAttributesObject = ViewData["htmlAttributes"] ?? new { };
var htmlAttributes = Html.MergeHtmlAttributes(htmlAttributesObject, defaultHtmlAttributesObject);
}
defaultHtmlAttributesObject
生成された入力がその特定のテンプレートに対してデフォルトで持つべき属性に応じて、変数を変更します。