Pregunta

He un modelo de vista personalizada definida como:

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 que sólo explota, no está seguro de lo que está pasando, tiene el siguiente error: No sin parámetros constructor definido para este objeto. Ciertos me falta algo muy obvio aquí. Algunos antecedentes, el GET funciona perfectamente y visualizar el menú desplegable de la SelectList como se esperaba. Supongo que la auto-unión de vuelta al modelo de vista personalizada es lo que está fallando, pero no está seguro de qué hacer al respecto.

¿Fue útil?

Solución

Es necesario tener un constructor sin parámetros y creo que las propiedades deben tener los emisores públicos. El aglutinante defecto crea el objeto con un constructor que no toma ningún parámetro, a continuación, utiliza la reflexión sobre las propiedades públicas para establecer los valores de los parámetros de la forma / de 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 ligante será capaz de reconstruir un SelectList en el poste, ya que sólo tiene el valor seleccionado en los parámetros.

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

Otros consejos

MVC requiere, en vistas inflexible, que la vista puede crear la clase utilizada en ese punto de vista. Esto significa que un constructor sin parámetros. Y esto tiene sentido. La gente nueva a MVC verán similares "¿eh?" problemas cuando se olvidan / parámetros no pueden hacer pública y todos esos errores relacionados que emergente cuando la vista intenta ponerse juntos (en contraposición a un error del compilador).

Pero lo que es "interesante" en esta clase de problemas constructor sin parámetros es cuando una propiedad de la clase, además, no tiene un constructor sin parámetros. Creo que este es el enfoque pesimista?

Después de haber pasado algún tiempo de aprendizaje en la clase SelectList - una clase específica para MVC -. Quería ayudar con suerte algunas personas ahorrar unos cuantos minutos / horas

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

selectlist pública (artículos IEnumerable); SelectList pública (artículos IEnumerable, objeto SelectedValue); SelectList pública (artículos IEnumerable, DataValueField secuencia, secuencia de DataTextField); SelectList pública (artículos IEnumerable, cadena DataValueField, cadena DataTextField, objeto SelectedValue);

.. y por lo tanto, si estas son las propiedades de su clase (la que se utiliza para la vista), MVC le dará el error difícil de alcanzar "No sin parámetros del constructor".

Pero, si se crea algo así como una clase de ayuda, cortar y pegar el código exacto de su clase original, y luego hacer que la clase de ayuda un parámetro (no un get / set) en su clase original; eres bueno para ir.

Y de esta manera, se puede utilizar una única vista para obtiene y mensajes. Lo que es más hermoso:)

Personalmente, tendría ya sea creado el compilador de reconocer las asociaciones y los requisitos de fuertes puntos de vista con tipo, o dejar que el desplegable (u otro "cliente" de la SelectList) acaba de dejar de trabajar en lugar de preguntarse si hay un nivel específico de comprobación recursiva de constructores paramerterless.

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

HTH.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top