2011-08-29 22 views

risposta

74

Così, ho fatto qualcosa di simile:

@Html.DropDownListFor(model => model.Dessert, 
         new SelectList(Model.AvailableDesserts, "DessertID", "DessertName"), 
         "---Select A Dessert ---") 

sembra funzionare abbastanza bene. Dessert nel mio viewmodel è quello selezionato dall'utente. AvailableDesserts è una raccolta di quelli tra cui scegliere. Spero possa aiutare.

+2

Questo aggiunge un "--Please select--" nella parte superiore del menu a discesa, ma per impostazione predefinita all'elemento successivo nel menu a discesa, almeno nel mio esempio: @ Html.DropDownListFor ( x => x.SelectedTeamID, nuova lista di selezione (Model.Teams, "TeamID", "TeamName"), "--Please select--") – user517406

+4

Qual è il valore predefinito del SelectedTeamID che si sta inviando alla vista? Nel mio 'Create.cshtml' verrà impostato di default l'opzione" --- Select A Dessert --- "(l'ID è un numero intero e ha come valore predefinito 0) mentre nel mio' Edit.cshtml' verrà impostato di default a qualsiasi valore il valore corrente è per 'model.Dessert' nel mio viewmodel. Questo potrebbe essere il risultato del mio dessert che inizia a 1 (la chiave primaria nella mia tabella di dessert inizia a 1). Solo una supposizione, davvero. Penso che sia per quello che sta succedendo. – itsmatt

+0

Credo che quello che fa sia guardare il valore corrente del campo del modello e quindi provare a selezionarlo per impostazione predefinita. Ad esempio, se quando hai costruito il tuo viewmodel (ad esempio, per una chiamata Create) e hai impostato il SelectedTeamID su 6 e lo hai passato nella vista, verrà visualizzato TeamName associato a TeamID 6, supponendo che ne esistesse uno. – itsmatt

14

Ho un metodo paio derivazione a SelectList

public static SelectList PreAppend(this SelectList list, string dataTextField, string selectedValue, bool selected=false) 
    { 
     var items = new List<SelectListItem>(); 
     items.Add(new SelectListItem() { Selected = selected, Text = dataTextField, Value = selectedValue }); 
     items.AddRange(list.Items.Cast<SelectListItem>().ToList()); 
     return new SelectList(items, "Value", "Text"); 
    } 
    public static SelectList Append(this SelectList list, string dataTextField, string selectedValue, bool selected=false) 
    { 
     var items = list.Items.Cast<SelectListItem>().ToList(); 
     items.Add(new SelectListItem() { Selected = selected, Text = dataTextField, Value = selectedValue }); 
     return new SelectList(items, "Value", "Text"); 
    } 
    public static SelectList Default(this SelectList list,string DataTextField,string SelectedValue) 
    { 
     return list.PreAppend(DataTextField, SelectedValue, true); 
    } 

Poi il mio rasoio sembra:

@Html.DropDownListFor(m=>m.SelectedState, 
    Model.StateList().Default("Select One","")) 
+0

Sono nuovo a MVC, puoi per favore dimmi come aggiungerei i miei metodi di estensione alla mia SelectList? – user517406

+3

Aggiungere una classe statica al progetto e aggiungervi questi metodi. Assicurati che la pagina tenti di chiamarli dall'importazione dello spazio dei nomi se non è lo spazio dei nomi del progetto globale. La sintassi nel rasoio è '@using Myproject.Extensions' o qualsiasi altra cosa tu chiami la tua classe. Per ulteriori informazioni, consultare: http://msdn.microsoft.com/en-us/library/bb383977.aspx – asawyer

+0

Preferirei la route Helper/Extension come si propone ma sto avendo qualche problema nell'implementazione. Ottengo il seguente errore: 'Impossibile lanciare l'oggetto di tipo 'MyApp.UI.Models.Address' per digitare 'System.Web.Mvc.SelectListItem'. Il codice che uso è:' @ Html.DropDownListFor (m => m.EmailAddressID, nuova SelectList (Model.Addresses, "AddressID", "EmailAddress"). PreAppend ("--- Seleziona un indirizzo ---", "")) 'Compila bene ed è riconosciuto nella vista, ma presenta l'errore sopra in fase di esecuzione. Il metodo hardcoded presentato da @itsmatt funziona. Qualche idea sulla modifica potrei aver bisogno dei metodi di estensione? – atconway

3

Hi quello di provare questo (nel caso in cui si utilizza il metodo DisplayFor)

private IEnumerable<SelectListItem> AddDefaultOption(IEnumerable<SelectListItem> list, string dataTextField, string selectedValue) 
    { 
     var items = new List<SelectListItem>(); 
     items.Add(new SelectListItem() { Text = dataTextField, Value = selectedValue}); 
     items.AddRange(list); 
     return items; 
    } 

Quindi aggiungere questo codice al controller

//lambda expression binding 
ViewBag.YourList = db.YourTable.Select(x => x).ToList().Select(x => new SelectListItem 
     { 
      Value = x.Id.ToString(), 
      Text = x.DisplayName.ToString() 
     }); 

     ViewBag.YourList = AddDefaultOption(ViewBag.YourList, "Select One...", "null", true); 

E finalmente al View è possibile visualizzare un menu a discesa, casella combinata proprio come questo

<div class="editor-label"> 
     Your Label 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.ForeignKey, (IEnumerable<SelectListItem>)ViewBag.YourList) 
    </div> 
+0

È strano che tu stia facendo '.Select (x => x) .ToList()' prima del ' .Seleziona (x => new SelectListItem' Questo non è necessario. –

0

Ho voluto impostare il valore predefinito a tutto ciò che è stato passato come parametro URL chiamato SiteType:

<div class="form-group"> 
     @Html.LabelFor(model => model.Type, new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.DropDownListFor(model => model.Type, ChangeOrderSite.SiteTypeNames.Select(s => new SelectListItem { Text = s.Value, Value = s.Key.ToString(), Selected = s.Key.ToString() == Request["SiteType"] }), new { @class = "control-label col-md-2" }) 
      @Html.ValidationMessageFor(model => model.Type) 
     </div> 
    </div> 

La mia discesa è un elenco di tipi di sito.

Problemi correlati