2009-04-19 9 views
8

he un modelo de vista personalizada definida como:MVC modelo de vista personalizada y vinculante de auto

public class SampleFormViewModel 
{ 
    public SampleFormViewModel(SelectList companies, Widget widget) 
    { 
     Companies = companies; 
     Widget = widget; 
    } 

    public SelectList Companies { get; private set; } 
    public Widget Widget { get; private set; } 
} 

En mi manejador Edit Post Tengo la siguiente entrada:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(SampleFormViewModel model) 
{ 

formulario Editar está configurado como:

Inherits="System.Web.Mvc.ViewPage<Sample.Web.Models.SampleFormViewModel>" 

Y simplemente explota, no estoy seguro de lo que está pasando, tiene el siguiente error: No p constructor sin parámetros definido para este objeto. Estoy seguro de que me falta algo realmente obvio aquí. Algunos antecedentes, el GET funciona perfectamente y muestra el menú desplegable de la lista de selección como se esperaba. Supongo que volver a enlazar automáticamente al modelo de vista personalizada es lo que está fallando pero no estoy seguro de qué hacer al respecto.

+0

¿Cómo es el formulario que está publicando? –

Respuesta

8

Necesita tener un constructor sin parámetros y creo que las propiedades deben tener establecedores públicos. El encuadernador predeterminado crea el objeto usando un constructor que no toma parámetros, luego utiliza la reflexión sobre las propiedades públicas para establecer valores a partir de los parámetros de forma/consulta.

public class SampleFormViewModel 
{ 
    public SampleFormViewModel() { } 

    public SelectList Companies { get; set; } 
    public Widget Widget { get; set; } 
} 

Sospecho, sin embargo, que lo que realmente quiere hacer es no conseguir el modelo de vista, pero el modelo Widget subyacente y seleccione el valor de lista en forma posterior. No creo que el cuaderno pueda reconstruir una lista de selección en la publicación ya que solo tiene el valor seleccionado en los parámetros.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int CompanyID, Widget widget) 
{ 
} 
+0

Sí, lo entiendo ahora. El problema fue que SelectList no tiene constructores sin parámetros. Si elimino SelectList (Empresas) del constructor. Y compilarlo sobre la marcha (a partir de la información en el objeto widget) cuando creo ViewModel todo funciona como se espera. La única diferencia es cómo lo manejo en el POST, la firma ahora es: public ActionResult Edit (int id, FormCollection formValues) –

2

MVC requiere, en vistas fuertemente tipadas, que la vista pueda crear la clase utilizada en esa vista. Esto significa un constructor sin ningún parámetro. Y esto tiene sentido. La gente nueva en MVC verá un "¿eh?" Similar. problemas cuando olvidan/dejan de hacer públicos los parámetros y todos los errores relacionados que aparecen cuando la vista intenta juntarse (a diferencia de un error del compilador).

Pero lo que es "interesante" en esta clase de problemas constructor sin parámetros es cuando una propiedad de su clase tampoco tiene un constructor sin parámetros. ¿Supongo que este es el enfoque pesimista?

Después de haber pasado algún tiempo de aprendizaje en la clase SelectList, una clase específica de MVC, quería ayudar a algunos a ahorrar unos minutos/horas.

Esta herramienta/clase muy importante para la creación de la lista desplegable, tiene las siguientes constructores:

SelectList pública (artículos IEnumerable); publicListList (elementos IEnumerable, object selectedValue); lista de selección pública (elementos IEnumerable, cadena dataValueField, cadena dataTextField); lista de selección pública (elementos IEnumerable, cadena dataValueField, cadena dataTextField, object selectedValue);

..y, por lo tanto, si se trata de propiedades de su clase (la que se utiliza para la vista), MVC le dará el escurridizo error "No parameterless constructor".

PERO, si creas algo así como una clase auxiliar, corta y pega el código exacto de tu clase original y luego convierte esa clase auxiliar en un parámetro (NO un get/set) en tu clase original; eres bueno para ir.

Y de esta manera, puede usar una única vista para obtener y publicar mensajes.Lo cual es más hermoso :)

Personnally, habría creado el compilador para reconocer las asociaciones y los requisitos de las vistas de tipos fuertes, o dejaría que el menú desplegable (u otro "cliente" de la lista Select) simplemente no funcionara luego nos preguntamos si hay un nivel específico de comprobación recursiva en constructores sin parámetros.

Afortunadamente, la versión actual parece ser solo de nivel superior. Se siente como un truco y espero que sea por diseño.

HTH.

+1

¿Podría explicar la afirmación sobre la clase de ayuda para listas de selección ?, ¿quizás con un ejemplo de código? – camainc

Cuestiones relacionadas