2012-10-06 13 views
27

Domanda: Ho bisogno di creare una DropDownList come questo:DropDownListFor con un attributo personalizzato con il nome di attributo in?

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

Ora posso aggiungere attributi personalizzati in questo modo:

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

Purtroppo, se v'è un "-" nel nome della variabile, quindi non viene compilato.

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

E il multiplo, che non ha valore di attributo?

Se mi passa un dizionario o un NameValueColletion al posto del new { @disabled = "disabled" }, allora emette le proprietà del NameValueColletion/Dizionario ...

Come posso passare attributi con i caratteri speciali nella chiave di attributo?

+0

possibile duplicato di [Attributi html sillabati con asp.net mvc] (http://stackoverflow.com/questions/2897733/hyphenated-html-attributes-with-asp-net-mvc) –

risposta

59

utilizza un trattino invece

@data_placeholder = "whatever" 

Dal MVC3 "_" è sostituito con "-" se fusi.

Ciò funziona correttamente poiché i caratteri di sottolineatura non sono accettabili nei nomi di attributi in html.

3

Ah, è facile.
L'errore è stato quello di dichiarare un dizionario di <string, string> invece di un dizionario di <string, object> (e di utilizzare le variabili invece di immobili a cOption) ...


con il dizionario di <string, string> utilizza l'oggetto "paramlist" sovraccarico, invece di 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>(); 

    } 

o più 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); 
} 
+0

È divertente, non ho mai applicato in questo modo. Freddo! – Jowen

Problemi correlati