2011-11-18 12 views
39

Parece extraño que no pude encontrar una explicación de la diferencia entre esos dos ayudantes, así que supongo que es algo obvio, pero me perdí.Diferencia entre DropDownlist o DropDownListFor Html helper

Básicamente estoy tratando de decidir cuál debo utilizar para mi caso, con el siguiente modelo simple:

public class Booking 
    { 
     public int ID { get; set; } 
     public Room Room { get; set; } 
     public DateTime StartTime { get; set; } 
     public DateTime EndTime { get; set; } 
     public ICollection<Equipment> Equipments { get; set; } 
     public string Who { get; set; } 
    } 

y quiero mostrar una habitación sencilla lista desplegable para añadir y registro de edición de la reserva.

Después de hacer un montón de Google alrededor, parece que probablemente necesite un DropDopwListFor, pero no estoy seguro de por qué y cómo?

+0

Gracias por los buenos ejemplos, tiene sentido y mi pregunta es trivial: D. Pero ¿por qué todos me dan un ejemplo de Dropdownlist for Equipment, pero estoy pidiendo un ejemplo de habitación funcional, pero supongo que funcionarán de la misma manera? –

Respuesta

76

Tomar los dos ejemplos siguientes:

@Html.DropDownListFor(
    x => x.EquipmentId, 
    new SelectList(Model.Equipments, "Id", "Text") 
) 

y:

@Html.DropDownList(
    "EquipmentId", 
    new SelectList(Model.Equipments, "Id", "Text") 
) 

Es obvio que con el segundo ejemplo, el nombre de la propiedad va a enlazar el menú desplegable para está codificado como una magia cuerda.Esto significa que si decide refaccionar su modelo y renombrar esta propiedad, el soporte de herramientas que pueda estar utilizando no tiene forma de detectar este cambio y de modificar automáticamente la cadena mágica codificada en potencialmente muchas vistas. Por lo tanto, tendrá que buscar manualmente & reemplazar en cualquier lugar donde se use este helper débilmente tipado.

Con el primer ejemplo, por otro lado, estamos usando una expresión lambda fuertemente tipada vinculada a la propiedad del modelo dado para que las herramientas puedan cambiarle el nombre automáticamente en cualquier lugar que se use si decide refactorizar su código. Además, si decide precompilar sus vistas, obtendrá un error de tiempo del compilador que apunta inmediatamente a la vista que debe corregirse. Con el segundo ejemplo, usted (idealmente) o los usuarios de su sitio (el peor de los casos) obtendrán un error de tiempo de ejecución cuando visiten esta vista en particular.

Los ayudantes fuertemente tipados se introdujeron por primera vez en ASP.NET MVC 2 y la última vez que utilicé un ayudante de tipo débil fue en una aplicación ASP.NET MVC 1 hace mucho tiempo.

+0

Gran ejemplo :) – kbvishnu

+0

Actualización para V6: obviamente puede omitir la cadena mágica con el nuevo nombre de palabra clave (nombrede (x.EquipmentId) que da como resultado ID de equipo. – TomTom

5

DropDownListFor seleccionará automáticamente el valor seleccionado mediante el uso de la propiedad especificada:

// Will select the item in model.Equipments that matches Model.EquipmentId 
@Html.DropdownListFor(m => m.EquipmentId, Model.Equipments); 

Otro comentario:

No tienen ICollection<Equipment> Equipments en su modelo de vista. Debería tener una propiedad que devuelva IEnumerable<SelectListItem>.

+0

Gracias por ayudarme. Pero en realidad estoy pidiendo la lista desplegable de Habitación, solo estoy tratando de entender la idea. Además, no entiendo su ejemplo en el código de vista sobre DropdownListFor para equipos. Parece que sugiere que agregue un ViewModel que devuelva IEnumberable en mi ViewModel y lo devuelva desde el control a mi vista en lugar del modelo de Booking. ¿Podrían proporcionarme una base de ejemplo totalmente funcional en mi modelo o una mejor? Ahora estoy atascado porque no pude encontrar un ejemplo funcional que pueda encajar en mi modelo. –

2

Cuando se quiere agregar la vista (aspx archivo), donde este DropDownList o DropDownListFor habrá dentro, rightclick-> Añadir vista a continuación, seleccione "Crear una vista inflexible" a continuación, seleccione en la lista Booking clase. Después de eso agrega esta página.

Se puede escribir de la forma siguiente:

@Html.DropdownListFor(m => m.Equipments , Model.Equipments); 

porque añadimos establecimiento inflexible vista como Booking, puede tener:

m => m.ID, m => m.Room, m => m.StartTime 

... etc

En su servicios puede tener métodos para tomar datos de la base de datos, luego use el método de este servicio en su controlador para pasar datos de la base de datos para ver. Puede utilizar ViewData en su controlador:

ViewData["Equipments"] = new servicename().getdatalistfromdatabase().AsEnumarable(); 

Poner AsEnumarable() al final de su lista tomada de la base de datos hace que sea IEnumarable.

A continuación, en su opinión, también puede tener:

@Html.DropdownList("MyEquipments" , ViewData["Equipments"]); 

Un enlace en el uso ViewData: http://msdn.microsoft.com/en-us/library/dd410596.aspx

espero que le ayuda.

+0

el enlace en su respuesta está muerto – dakait

+0

Creo ViewData fue reemplazado por ViewBag en MVC 3: http://weblogs.asp.net/scottgu/announcing-asp-net-mvc-3-release-candidate-2 ViewBag tiene fuertemente propiedades de tipo en lugar de las cadenas utilizadas en ViewData. Es la misma razón de por qué deberíamos usar DropDownListFor en lugar de DropDownList. –

2

DropdownListFor es compatible con el tipo fuerte y asignar el nombre de expresión lambda por lo que muestra error de compilación momento si tenga cualquier error.

DropdownList es compatible con esta.

Cuestiones relacionadas