2012-07-16 14 views
8

Esiste un modo per dire che la proprietà my view model deve essere visualizzata come DropDownList (in modo che sia possibile specificare gli articoli DropDownList)?Supporto incorporato ASP.NET MVC per il modello di editor DropDownList

Ho trovato molte implementazioni personalizzate ma suppongo che ci dovrebbe essere un modo integrato per implementare una cosa di base.

Aggiornamento . sto il rendering mio modello da Html.EditorForModel metodo, non voglio usare metodi come Html.DropDownListFor

risposta

14

Non c'è alcun modello integrato che rende un elenco a discesa, tranne che per il tipo di Nullable<bool> che visualizza un elenco a discesa Not Set, Yes, No ma presumo che non sia quello che stai chiedendo.

Quindi costruiamone uno. Come sempre si inizia con la definizione del modello di vista che rappresenterà una tendina contenente 2 strutture (uno per il valore selezionato e uno per i valori disponibili):

public class ItemViewModel 
{ 
    public string SelectedId { get; set; } 
    public IEnumerable<SelectListItem> Items { get; set; } 
} 

allora potremmo avere una vista modello standard con questa proprietà:

public class MyViewModel 
{ 
    public ItemViewModel Item { get; set; } 
} 

poi un controller che riempirà il modello di vista:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      Item = new ItemViewModel 
      { 
       SelectedId = "2", 
       Items = new[] 
       { 
        new SelectListItem { Value = "1", Text = "item 1" }, 
        new SelectListItem { Value = "2", Text = "item 2" }, 
        new SelectListItem { Value = "3", Text = "item 3" }, 
       } 
      } 
     }; 
     return View(model); 
    } 
} 

e una corrispondente vista (~/Views/Home/Index.cshtml):

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.EditorForModel() 
} 

Ora tutto quello che resta è quello di definire un modello di editor personalizzato per il tipo di DropDownViewModel (~/Views/Shared/EditorTemplates/DropDownViewModel.cshtml):

@model DropDownViewModel 
@Html.DropDownListFor(
    x => x.SelectedId, 
    new SelectList(Model.Items, "Value", "Text", Model.SelectedId) 
) 

e sovrascrivere il modello predefinito per il tipo di oggetto, al fine di consentire Deep Dive come spiega Brad Wilson in his blog post. Altrimenti, per impostazione predefinita, ASP.NET MVC non ricercherà in sottotipi complessi per i modelli. Così sovrascriviamo ~/Views/Shared/EditorTemplates/Object.cshtml:

@foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm))) 
{ 
    if (prop.HideSurroundingHtml) 
    { 
     @Html.Editor(prop.PropertyName) 
    } 
    else 
    { 
     <div class="editor-label"> 
      @(prop.IsRequired ? "*" : "") 
      @Html.Label(prop.PropertyName) 
     </div> 
     <div class="editor-field"> 
      @Html.Editor(prop.PropertyName) 
      @Html.ValidationMessage(prop.PropertyName, "*") 
     </div> 
    } 
} 
+1

ciò che è DropDownViewModel nel controller, è ItemViewModel? – mmssaann

+0

Questo non sta visualizzando il menu a discesa per me. sta giocando è voce in caselle di testo. Posso essere sto facendo qualcosa di sbagliato nel controller con DropDownViewModel. Non riesco a trovare questa classe qui. puoi consigliarti? – mmssaann

+1

Capito, è un problema di denominazione. Devo dare lo stesso nome che è "ItemViewModel" anche per il file editortemplate. – mmssaann

1

Si potrebbe utilizzare Html Helper DropDownList per costruire la vostra lista di goccia, ma l'oggetto del modello verso il basso dovrebbe essere inumerable di SelectionListItem.

//on controller 
    List<SelectListItem> items = new List<SelectListItem>(); 
    items.Add(new SelectListItem { Text = "Action", Value = "0"}); 
    items.Add(new SelectListItem { Text = "Drama", Value = "1" }); 
    items.Add(new SelectListItem { Text = "Comedy", Value = "2", Selected = true }); 
    items.Add(new SelectListItem { Text = "Science Fiction", Value = "3" }); 
    ViewBag.MovieType = items; 

//on view 

     @Html.DropDownList("MovieType") 

Se non si vuole costruire l'oggetto del modello come SelectListItem, quindi si dovrebbe utilizzare DropDownListFor

//you can use DropDownListFor as 
@Html.DropDownListFor(m=>m.Text,m.Value) 
+0

Si prega di guardare domanda di aggiornamento – SiberianGuy

Problemi correlati