web-dev-qa-db-ja.com

属性名に-を含むカスタム属性を持つDropDownListForですか?

質問:次のようなドロップダウンリストを作成する必要があります。

<select id="ddCustomers" data-placeholder="Choose a customer" class="chzn-select" style="width:350px;" tabindex="1" multiple>

これで、次のようなカスタム属性を追加できます。

@Html.DropDownListFor(m => m.Id, Model.Values, new { @disabled = "disabled" })

残念ながら、変数名に「-」が含まれていると、コンパイルされません。

@Html.DropDownListFor(m => m.Id, Model.Values, new { @disabled = "disabled", @data-placeholder = "whatever" })

そして、属性値を持たない倍数はどうですか?

new { @disabled = "disabled" }の代わりにDictionaryまたはNameValueColletionを渡すと、NameValueColletion/Dictionaryのプロパティが出力されます...

属性キーに特殊文字を含む属性を渡すにはどうすればよいですか?

33
Stefan Steiger

代わりにアンダースコアを使用してください

@data_placeholder = "whatever"

Mvc3の「_」はレンダリング時に「-」に置き換えられるため。

アンダースコアはhtmlの属性名では受け入れられないため、これは正常に機能します。

67
dove

ああ、それは簡単です。
間違いは、<string, string>の辞書の代わりに<string, object>の辞書を宣言することでした(cOptionのプロパティの代わりに変数を使用する)...


<string, string>の辞書では、IDictionary<string, object>の代わりにオブジェクト「paramlist」オーバーロードを使用します;)

@Html.DropDownListFor(model => model.Title, new SelectList(Model.ls, "value", "text"), Model.nvc)

 <!--
 @Html.DropDownList("myIdAndName", new SelectList(Model.ls, "value", "text"), Model.nvc)
 -->




    public ActionResult Index()
    {
        cHomeModel HomeModel = new cHomeModel();

        HomeModel.nvc.Add("class", "chzn-select");
        HomeModel.nvc.Add("data-placeholder", "Choose a customer");
        HomeModel.nvc.Add("style", "width:350px;");
        HomeModel.nvc.Add("tabindex", "1");
        HomeModel.nvc.Add("multiple", "multiple");
        HomeModel.nvc.Add("id", "lol");


        cOption option = null;


        for (int i = 0; i < 10; ++i)
        {
            option = new cOption();

            option.value = i.ToString();
            option.text = "text" + i.ToString();

            HomeModel.ls.Add(option);
        }


        return View(HomeModel);
    }





    public class cOption
    {
        public string value
        {
            get;
            set;
        }

        public string text
        {
            get;
            set;
        }

    }


    public class cHomeModel
    {
        public string Title = "MyDropDownListName";
        public List<cOption> ls = new List<cOption>();


        public System.Collections.Generic.Dictionary<string, object> nvc = new System.Collections.Generic.Dictionary<string, object>();

    }

以上のLinqiq:

public ActionResult Index()
{
    cHomeModel HomeModel = new cHomeModel();

    HomeModel.nvc.Add("class", "chzn-select");
    HomeModel.nvc.Add("data-placeholder", "Choose a customer");
    HomeModel.nvc.Add("style", "width:350px;");
    HomeModel.nvc.Add("tabindex", "1");
    HomeModel.nvc.Add("multiple", "multiple");
    HomeModel.nvc.Add("id", "lol");


    HomeModel.ls = System.Linq.Enumerable.Range(0, 9)
            .Select(x => new cOption() { text = x.ToString(), value = x.ToString() })
            .ToList();


    // or otherwise: 
    HomeModel.ls = (
                 from i in System.Linq.Enumerable.Range(0, 9)
                 select new cOption() { text = i.ToString(), value = i.ToString() }
    ).ToList();


    return View(HomeModel);
}
3
Stefan Steiger