2012-03-01 11 views
10

Attualmente sto usando un controllo Html.EditorFor in un default 'Crea' Visualizza pagina come questa.Conversione HTML.EditorFor in un menu a discesa (html.dropdownfor?)

Vorrei convertirlo in un menu a discesa con valori ed essere ancora associato al modello nella vista. La mia domanda è due volte.

  1. Se nel menu a discesa sono necessari solo 2/3 valori, c'è un modo rapido per inserire in modo esplicito 2 o 3 valori?

  2. Se la lista è grande e ha bisogno di venire da una query SQL, come fare questo?

Grazie in anticipo per l'aiuto.

risposta

30

Per generare un elenco a discesa sono necessarie 2 proprietà sul modello di visualizzazione: una proprietà scalare per associare il valore selezionato a e una proprietà di raccolta che conterrà gli elementi da mostrare nel menu a discesa.

Così si potrebbe definire un modello di vista:

public class DropDownListViewModel 
{ 
    public string SelectedValue { get; set; } 
    public IEnumerable<SelectListItem> Items { get; set; } 
} 

e quindi del modello di vista principale avere una proprietà di questo tipo:

public DropDownListViewModel Foo { get; set; } 

Ora si potrebbe avere un editor di modelli su misura per questo tipo (~/Views/Shared/EditorTemplates/DropDownListViewModel.ascx):

<%@ Control 
    Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DropDownListViewModel>" 
%> 
<%= Html.DropDownListFor(x => x.SelectedValue, Model.Items) %> 

e poi nella visualizzazione principale:

<%= Html.EditorFor(x => x.Foo) %> 

Ora tutto quello che resta è quello di avere il rendering azione di controllo della vista principale per riempire la proprietà Foo con i corrispondenti valori. Il potrebbe essere hardcoded, provenire da un repository o qualsiasi altra cosa. Non importa.

D'altra parte se si conoscevano i valori di anticipo si potevano hardcode in Editor modello (~/Views/Shared/EditorTemplates/YesNoDropDown.ascx):

<%= Html.DropDownList(
    "", 
    new SelectList(
     new[] 
     { 
      new { Value = "true", Text = "Yes" }, 
      new { Value = "false", Text = "No" }, 
     }, 
     "Value", 
     "Text", 
     Model 
    ) 
) %> 

e poi:

<%= Html.EditorFor(x => x.IsActive, "YesNoDropDown") %> 

o decorando la proprietà IsActive sul tuo punto di vista modello:

[UIHint("YesNoDropDown")] 
public bool IsActive { get; set; } 

e quindi:

<%= Html.EditorFor(x => x.IsActive) %> 
+0

Grazie per la soluzione. Sto ottenendo un'eccezione prevista Identifier nella pagina .ascx editor di modelli ... nei pressi di nuovo [] – ZVenue

+0

@ZVenue, ancora problemi con questo? –

+0

Niente più problemi .. grazie per il vostro aiuto .. La soluzione Modificato qui .. http://stackoverflow.com/questions/9568111/problems-converting-editorfor-to-dropdownlist – ZVenue