Soy relativamente nuevo para ver modelos y estoy corriendo en un par de problemas con el uso de ellas. He aquí una situación en la que estoy preguntando cuál es la mejor práctica es…

Me voy a poner toda la información en una vista de las necesidades en el modelo de vista. He aquí un ejemplo, por favor perdonen si hay errores, se codifica la parte superior de mi cabeza.

public ActionResult Edit(int id)
{
    var project = ProjectService.GetProject(id);

    if (project == null)
        //Something about not found, possibly a redirect to 404.

    var model = new ProjectEdit();
    model.MapFrom(project); //Extension method using AutoMapper.

    return View(model);
}

Si la pantalla sólo se permite la edición de uno o dos campos, cuando el modelo de vista viene de atrás le falta un poco de datos (como debe ser).

[HttpPost]
public ActionResult Edit(int id, ProjectEdit model)
{
    var project = ProjectService.GetProject(id);

    if (project == null)
        //Something about not found, possibly a redirect to 404.

    try
    {
        if (!ModelState.IsValid)
            return View(model) //Won't work, view model is incomplete.

        model.MapTo(project); //Extension method using AutoMapper.
        ProjectService.UpdateProject(project);
        //Add a message for the user to temp data.

        return RedirectToAction("details", new { project.Id });
    }
    catch (Exception exception)
    {
        //Add a message for the user to temp data.

        return View(model) //Won't work, view model is incomplete.
    }
}

Mi solución temporal para volver a la vista de modelo desde cero, llenarlo desde el modelo de dominio, vuelva a aplicar el formulario de datos para, a continuación, proceder como normal. Pero esto hace que el modelo de vista parámetro de algo sin sentido.

[HttpPost]
public ActionResult Edit(int id, ProjectEdit model)
{
    var project = ProjectService.GetProject(id);

    if (project == null)
        //Something about not found, possibly a redirect to 404.

    //Recreate the view model from scratch.
    model = new ProjectEdit();
    model.MapFrom(project); //Extension method using AutoMapper.

    try
    {
        TryUpdateModel(model); //Reapply the form data.

        if (!ModelState.IsValid)
            return View(model) //View model is complete this time.

        model.MapTo(project); //Extension method using AutoMapper.
        ProjectService.UpdateProject(project);
        //Add a message for the user to temp data.

        return RedirectToAction("details", new { project.Id });
    }
    catch (Exception exception)
    {
        //Add a message for the user to temp data.

        return View(model) //View model is complete this time.
    }
}

Hay una forma más elegante?

EDITAR

Ambas respuestas son correctas así que me gustaría premio a los dos si yo pudiera. El nod va a MJ sin embargo, ya que después de prueba y error, yo encontrar su solución para ser más magros.

Todavía soy capaz de utilizar los ayudantes también, Jimmy. Si puedo añadir lo que necesito para ser mostrados a la vista de la bolsa (o en la vista de datos), como así…

ViewBag.Project= project;

Puedo hacer lo siguiente…

@Html.LabelFor(model => ((Project)ViewData["Project"]).Name)
@Html.DisplayFor(model => ((Project)ViewData["Project"]).Name)

Un poco de un hack, y requiere el modelo de dominio para ser decorado con System.ComponentModel.DisplayNameAttribute en algunos casos, pero yo ya lo hacen.

Me encantaría llamar…

@Html.LabelFor(model => ViewBag.Project.Name)

Pero dinámico provoca un problema en las expresiones.

  • puedes mirar aquí : prodinner.codeplex.com para las mejores prácticas (incluyendo viewmodel) en asp.net mvc

2 Comentarios

  1. 13

    Después de un poco de ensayo y error (también conocido como código, entonces el odio es) de aprendizaje, mi método preferido es:

    Yo uso vista de los modelos de sólo para enlazar los campos de entrada. Así que, en su caso, si su opinión es sólo la edición de dos campos, a continuación, su punto de vista-modelo sólo tienen dos propiedades. Los datos necesarios para rellenar la vista (listas desplegables, etiquetas, etc), uso de la dinámica de la ViewBag.

    Creo que la visualización de la vista (es decir, rellenar de cualquier cosa a la vista de las necesidades de la pantalla), y la captura de la publicación de los valores del formulario (la unión, validación, etc) hay dos preocupaciones. Y me parece que la mezcla de los datos necesarios para rellenar la vista con la que se devuelve desde el punto de vista consigue sucio, y crea exactamente su situación más a menudo que no. No me gusta parcialmente llena de objetos que se pasa alrededor.

    No estoy seguro de cómo esto se desempeña con Automapper (para el mapeo del objeto de dominio de la dinámica ViewBag), aunque, como no lo he utilizado. Creo que tiene una DynamicMap método que puede funcionar? Usted no debería tener problemas de asignación automática el publicado con establecimiento inflexible de tipos ViewModel en el objeto de Dominio.

    • Ignorando AutoMapper – eso es sólo si usted tiene el problema de asignación de objetos de visualización de la vista de los modelos son muy útiles si usted está haciendo el MVC con plantilla de ayudantes (Html.DisplayFor).
    • Me gusta el sonido de este, porque mi punto de vista de los modelos de reflejar sólo lo que yo quiero volver y sería más delgado como un resultado. Me gustaría bajar de Html.DisplayFor como Jimmy dice, pero que podrían ser subsanadas con algunos HtmlHelper extensiones de mi propia. No estoy disfrutando de la vista de modelo «impuesto» en este momento, este enfoque tiene la ventaja de reducir un poco.
  2. 8

    Si entiendo correctamente, su viewmodel, probablemente, de aspecto muy similar a su dominio de la entidad. Usted mencionó que la perspective puede volver en su mayoría vacías, ya que sólo ciertos campos editables.

    Suponiendo que se tiene una vista en la que sólo unos pocos campos están disponibles para editar (o display), estos son los sólo campos que debe estar disponible en su viewmodel. Por lo general crear un viewmodel por la vista, y dejar que la controladora o un servicio de identificador de la entrada del usuario y el mapa de nuevo con el dominio de la entidad después de realizar algunas de validación.

    Aquí‘s un hilo sobre las mejores prácticas para la viewmodel que puede encontrar útiles.

    Edición: también puede aceptar un punto de vista diferente del modelo en el sistema de Edición/POST acción de su Editar/CONSEGUIR la acción sirve. Yo creo que esto debería funcionar siempre como el modelo de cuaderno puede entenderlo.

    • Que tiene la ventaja adicional de hacer que mi punto de vista los modelos mucho más ágil. Pero, ¿de dónde la pantalla de datos sólo ir? Se pone de objetos del modelo de dominio (o DTOs) en ViewData/ViewBag a manejar eso?
    • Probablemente debería volver a estado de mi respuesta. Los datos que usted está visualizando se debe incluir en sus modelos de vista así.
    • Ver mi respuesta actualizada. La edición/POST acción podría contener sólo los campos editables
    • Lo que significa que OBTENER el modelo de vista debe ser recreado (y tener los datos del formulario aplicado si quiero que el usuario vea lo que ha cambiado) antes de mostrar la vista de nuevo en el caso de datos no válidos o una excepción. Similar a la anterior método de acción en mi pregunta, pero tal vez no recrear OBTENER el modelo de vista hasta que sea absolutamente necesario.
    • Sí, eso es correcto. Además, debería volver a crear el OBTENER la vista de modelo a la hora de la validación en el servidor falla. Sin embargo, herramientas como AutoMapper hacer esto más fácil.
    • He estado tratando de esto, Andrew, y no parece ser un riesgo de seguridad. Al tener todo lo que en el modelo de vista, editable de datos así como no se puede editar los datos, no un usuario nuevo cargo extra valores como si el no se puede editar los datos en realidad era editable? El controlador no saben la diferencia, porque todos en el modelo de vista, y por lo aceptaría. Hay un caso que creo que aquí sólo para tener lo que se pueda editar en la vista del modelo, y poner todo lo demás en el punto de vista de la bolsa, ala de Michael respuesta. Los pensamientos?
    • Supongo que aquí es donde otro punto de vista se utiliza el modelo para el puesto de acción, que sólo contiene los valores que se espera de nuevo. Pero yo estoy trabajando con dos modelos de vista.

Dejar respuesta

Please enter your comment!
Please enter your name here