2012-03-01 11 views
10

Actualmente estoy usando un control Html.EditorFor en una página de vista predeterminada 'Crear' como esta.Conversión de HTML.EditorFor en un menú desplegable (html.dropdownfor?)

<%: Html.EditorFor(model => model.IsActive) %> 

Me gustaría convertir esto a un menú desplegable con valores y todavía estar vinculado al modelo en la vista. Mi pregunta es doble

  1. Si hay sólo 2/3 valores necesarios en la gota down..Is Hay una manera rápida para poblar de forma explícita 2 o 3 valores?

  2. Si la lista es grande y debe provenir de una consulta sql, ¿cómo hacer esto?

Gracias de antemano por la ayuda.

Respuesta

30

Para generar una lista desplegable, necesita 2 propiedades en su modelo de vista: una propiedad escalar para vincular el valor seleccionado y una propiedad de colección que contendrá los elementos que se mostrarán en el menú desplegable.

Así se podría definir una vista de modelo:

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

y luego el modelo de la vista principal tiene una propiedad de este tipo:

public DropDownListViewModel Foo { get; set; } 

Ahora usted podría tener un editor de plantillas a medida para este tipo (~/Views/Shared/EditorTemplates/DropDownListViewModel.ascx):

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

y luego en su vista principal:

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

Ahora todo lo que queda es que su acción del controlador haciendo que la vista principal para llenar la propiedad Foo con los valores correspondientes. El podría estar codificado, venir de un repositorio o lo que sea. Realmente no importa.

Por otro lado si conocían los valores de anticipación se podría codificar en el editor de plantillas (~/Views/Shared/EditorTemplates/YesNoDropDown.ascx):

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

y luego:

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

o mediante la decoración de la propiedad IsActive en su modelo de vista:

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

y luego:

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

Gracias por la solución. Obtengo una excepción esperada Identificador en la plantilla del editor .ascx página ... cerca de nuevo [] – ZVenue

+0

@ZVenue, ¿todavía tiene problemas con este? –

+0

No más problemas ... gracias por su ayuda ... Su solución modificada aquí ... http://stackoverflow.com/questions/9568111/problems-converting-editorfor-to-dropdownlist – ZVenue

Cuestiones relacionadas