2009-08-05 20 views
11

Con la adición de MVC 2 de HtmlHelper EditorFor() no es posible crear plantillas de visualización y editor fuertemente tipadas para un objeto de modelo dado y después de manipularlo I Estoy un poco perplejo en cuanto a cómo pasar datos adicionales del modelo al editor sin perder el fuerte tipeo del control del editor.ASP.NET MVC 2 - HTML.EditorFor() y Custom EditorTemplates

Classic Ejemplo: El producto tiene categoría. ProductEditor tiene una DropDownList para Categoría que contiene los nombres de todas las Categorías. El ProductEditor está fuertemente tipeado en Product y necesitamos pasar la lista de categorías y el producto.

Con una vista estándar, envolveríamos los datos del modelo en un tipo nuevo y los transmitiríamos. Con EditorTemplate perdemos parte de la funcionalidad estándar si pasamos un Modelo mixto que contiene más de un objeto (lo primero que noté fue que todos los métodos LabelFor/TextBoxFor estaban produciendo nombres de entidades como "Model.Object" en lugar de solo "Object" ").

¿Lo estoy haciendo mal o debería Html.EditorFor() tener un parámetro adicional ViewDataDictionary/Model?

Respuesta

13

Puede crear una costumbre modelo de vista que tiene tanto propiedades o que necesita para utilizar ViewData a pasar esa información en.

+2

Naturalmente esto tiene sentido, pero no pude dejar de notar que colocar el modelo en un modelo de vista personalizada hace que los nombres de campo de formulario para ser prefijadas por el nombre de la propiedad del objeto en el modelo de vista personalizada. No es que sea un problema, pero agrega un paso más para actualizar el modelo. Probablemente estoy lloriqueando innecesariamente ¿eh? –

5

Todavía estoy aprendiendo, pero tuve un problema similar para el que trabajé a cabo una solución. Mi categoría es una enumeración y uso un control de plantilla que examina la enumeración para determinar el contenido de la etiqueta Seleccionar.

Se utiliza en la vista como:

<%= Html.DropDownList 
      (
      "CategoryCode", 
      MvcApplication1.Utility.EditorTemplates.SelectListForEnum(typeof(WebSite.ViewData.Episode.Procedure.Category), selectedItem) 
      ) %> 

La enumeración de categoría está decorado con Descripción atributos para ser utilizado como los valores de texto en los elementos Seleccione:

public enum Category 
     { 
      [Description("Operative")] 
      Operative=1, 
      [Description("Non Operative")] 
      NonOperative=2, 
      [Description("Therapeutic")] 
      Therapeutic=3 
     } 
     private Category _CategoryCode; 
     public Category CategoryCode 
     { 
      get { return _CategoryCode; } 
      set { _CategoryCode = value; } 
     } 

las construcciones SelectListForEnum la lista de elementos seleccionados que usa la definición de enum y el índice para el elemento seleccionado actualmente, de la siguiente manera:

 public static SelectListItem[] SelectListForEnum(System.Type typeOfEnum, int selectedItem) 
    { 
     var enumValues = typeOfEnum.GetEnumValues(); 
     var enumNames = typeOfEnum.GetEnumNames(); 
     var count = enumNames.Length; 
     var enumDescriptions = new string[count]; 
     int i = 0; 
     foreach (var item in enumValues) 
     { 
      var name = enumNames[i].Trim(); 
      var fieldInfo = item.GetType().GetField(name); 
      var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); 
      enumDescriptions[i] = (attributes.Length > 0) ? attributes[0].Description : name; 
      i++; 
     } 
     var list = new SelectListItem[count]; 
     for (int index = 0; index < list.Length; index++) 
     { 
      list[index] = new SelectListItem { Value = enumNames[index], Text = enumDescriptions[index], Selected = (index == (selectedItem - 1)) }; 
     } 
     return list; 
    } 

El resultado final es un DDL muy bien presentado.

Espero que esto ayude. Cualquier comentario sobre mejores formas de hacer esto será muy apreciado.

Cuestiones relacionadas