web-dev-qa-db-fra.com

DropDownListFor avec un attribut personnalisé avec - dans le nom d'attribut?

Question: J'ai besoin de créer une liste déroulante comme celle-ci:

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

Maintenant, je peux ajouter des attributs personnalisés comme celui-ci:

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

Malheureusement, s'il y a un "-" dans le nom de la variable, alors il ne se compile pas.

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

Et qu'en est-il du multiple, qui n'a pas de valeur d'attribut?

Si je passe un dictionnaire ou un NameValueColletion au lieu du new { @disabled = "disabled" }, puis il affiche les propriétés de NameValueColletion/Dictionary ...

Comment passer des attributs avec des caractères spéciaux dans la clé d'attribut?

33
Stefan Steiger

Utilisez un trait de soulignement à la place

@data_placeholder = "whatever"

Puisque Mvc3 "_" est remplacé par "-" lors du rendu.

Cela fonctionne bien car les soulignements ne sont pas acceptables dans les noms d'attribut en html.

67
dove

Ah, c'est facile.
L'erreur était de déclarer un dictionnaire de <string, string> au lieu d'un dictionnaire de <string, object> (et pour utiliser des variables au lieu de propriétés dans cOption) ...


Avec dictionnaire de <string, string> il utilise la surcharge d'objet "paramlist", au lieu de IDictionary<string, object>;)

@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>();

    }

ou plus 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