SelectListItem con attributi dati

Esiste comunque la necessità di selezionare una lista di selezione su ViewModel con attributi dati?

voglio fare

@Html.DropdownListFor(m=> m.CityId, Model.Cities); 

quindi genera codice come:

   Montevideo Ciudad de la Costa  

    Ecco la soluzione semplice.

    Non tutto deve essere scritto con il metodo di estensione nel codice .NET. Una delle grandi cose di MVC è che ti dà un facile accesso per build il tuo codice HTML.

    Con MVC4 puoi ottenere l’id e il nome dell’elemento nell’albero delle espressioni con gli helper HTML.NameFor e HTML.IdFor

      

    Supponendo che Model.Cities sia una raccolta di elementi che espongono ciascuna di queste proprietà. Allora dovresti essere tutto pronto.

    Se vuoi riusabilità, considera di renderlo un modello editor per tutto ciò che è un Enumerable of Cities

    Dovrai estendere SelectListItem e quindi estendere DropDownListFor per utilizzare SelectListItem esteso.

    Dai un’occhiata a questa soluzione:

    Aggiunta di tag class html in in Html.DropDownList

    Avevo un requisito simile, ho creato un’estensione. Spero che aiuti per quelli che vogliono creare un’estensione.

     /*cs file*/ /*This contains your information with List*/ public class vmListItem { public int Id { get; set; } public string Name { get; set; } public string Tag { get; set; } } /*This contains the attributes in select, using List. Check cshtml */ public class vmAttribute { public string Key { get; set; } public string Value { get; set; } } ///  /// Creates a dropdownlist using a list with data attributes included ///  ///  /// id and name of the select /// list of attrs for select ///  /// id selected in option /// data-tagName you can choose the name of your tag /// first option in select ///  public static MvcHtmlString DropDownListForWithTag(this HtmlHelper helper, string id, List attributes, List items, int idSelected, string tagName = "tag", string textHeader= "") { var select = new TagBuilder("select"); select.GenerateId(id); select.MergeAttribute("name", id); foreach (vmAttribute att in atributos) select.MergeAttribute(att.Key, att.Value); TagBuilder headerOption = new TagBuilder("option"); headerOption .MergeAttribute("value", null); headerOption .InnerHtml = textHeader; select.InnerHtml += headerOption ; foreach(var item in items) { TagBuilder option = new TagBuilder("option"); option.MergeAttribute("value", item.Id.ToString()); option.MergeAttribute("data-" + tagName, item.Tag); if (idSelected == item.Id) option.MergeAttribute("selected", "selected"); option.InnerHtml = item.Name; select.InnerHtml += option.ToString(); } return new MvcHtmlString(select.ToString()); } /*cshtml file*/ @Html.DropDownListForWithTag("MovimientoBienMotivoId", new List { new vmAttribute("class", "form-control"), new vmAttribute("data-val", "true"), new vmAttribute("data-val-required", "El campo Motivo es obligatorio"), new vmAttribute("onchange", "movValidarCambioMotivo()"), }, (List)ViewBag.MovimientoBienMotivoId, Model.MovimientoBienMotivoId, "codigo", "Seleccione") @Html.ValidationMessageFor(model => model.ColumnId, "", new { @class = "text-danger" }) /*html results*/ 

    inserisci la descrizione dell'immagine qui

    MVC quando converte i nomi degli oggetti in nomi di attributi, si riallaccia “_” con “-“, quindi è:

     @Html.DropDownList(a=>a.websiteid, Model.GetItems, new{ data_rel="selected" }) 

    NON LA MIA RISPOSTA, CREDITO RISPOSTA VA A proposito di bruce (sqlwork.com) dai forum ASP> NET.

    Come posso aggiungere l’attributo data-rel = “selected” in dropdownlistfor htmlAttributes?

    VOLUTO VOLUTO AIUTARE QUINTO QUESTO SALVAVA ME DA CODIFICARE UNA HACK! GODERE.