En ASP.NET MVC, ¿deberían los modelos de vista tener una ID?

11

Cuando desarrolle una aplicación ASP.NET MVC que permita actualizar el modelo, necesita alguna forma de saber cómo tomar el modelo de vista actualizado y volver a compararlo con el modelo que ahora está actualizado. Parece que hay algunas formas diferentes de hacer esto y me pregunto si alguno de estos no es MVC adecuado (al igual que hacer que su controlador almacene datos que deberían estar en el modelo no es MVC adecuado).

Todos los modelos de vista tienen una identificación: Pros

  • Siempre asegúrese de que pueda combinar con su modelo.

Contras

  • Debe tener mucho cuidado de que ninguno de los ID se haya cambiado; de lo contrario, puede hacer que los usuarios actualicen las filas a las que no deberían tener acceso.

Solo los modelos con vista mínima mínima tienen una identificación: Pros

  • Se necesita mucho menos control para evitar que los usuarios actualicen datos a los que no deberían acceder.

Contras

  • Mucho más difícil de rastrear qué modelos de vista coincide con qué modelo.
  • Todavía tiene que verificar los pocos modelos de vista con ID para asegurarse de que el usuario no esté actualizando datos a los que no debería tener acceso.

Ningún modelo de vista tiene ID:

Pros

  • No es necesario verificar las ID para obtener actualizaciones.

Contras

  • Tienes que abandonar la apatridia.

Entonces tengo dos preguntas.

Primero, ¿hay una elección correcta / incorrecta? (Si no, eso significa que la elección es una cuestión de opinión y mi segunda pregunta está basada en la opinión y debe ignorarse).

En segundo lugar, si hay una elección correcta / incorrecta, ¿cuál es?

Para aclarar un comentario, estoy hablando cuando tiene un modelo de vista que es una imitación de su objeto de base de datos.

Piensa esto:

public class InvoiceViewModel  //Does not have ID, does not relate to model.
{
    public CustomerViewModel CustomerVM { get; set; }  //Maybe has ID?  Does relate to model.
    public AddressViewModel BillingAddressVM { get; set; } //Ditto
    public AddressViewModel ShippingAddressVM { get; set; } //Ditto
    public List<InvoiceLineItemViewModel> ItemVMs { get; set; }  //Each one has an ID?
}

no esta:

public class InvoiceViewModel
{
    public Customer Customer { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public List<InvoiceLineItem> Items { get; set; }
}
Lawtonfogle
fuente
2
¿Qué harías exactamente con una ID de ViewModel? ¿No tienen los objetos individuales en ViewModel sus propios ID?
Robert Harvey
Probablemente debería especificar solo cuando el modelo de vista está relacionado con un modelo. No todos los modelos de vista están relacionados.
Lawtonfogle
You have to abandon statelessness.- Acabas de elegir utilizar MVC sin sentido.
Joel Etherton
¿La ID a la que se refiere aquí es una clave primaria de la base de datos o algo más que está agregando al ViewModel?
Vermis
@Vermis, creo que una clave primaria de la base de datos sería una identificación simple. Una identificación más exhaustiva sería cualquier dato no modificable que le permita relacionar su objeto editado con la versión persistente aún no editada para que los cambios editados puedan persistir.
Lawtonfogle

Respuestas:

1

El objeto ViewModel no es lo que se almacena en una tabla de base de datos, en general. Son los elementos individuales en el objeto ViewModel que se almacenan. Cada uno de esos artículos ya tiene una identificación.

Por ejemplo:

public class InvoiceViewModel
{
    public Customer Customer { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public List<InvoiceLineItem> Items { get; set; }
}

Como no hay una sola tabla en la base de datos que corresponda a un InvoiceViewModel, no hay ID para un objeto InvoiceViewModel.

Por supuesto, siempre puede usar el InvoiceID como id para este ViewModel en particular. InvoiceID es útil, porque eso es lo que este objeto representa en última instancia. Pero pude ver que tengo un objeto ViewModel que no corresponde a ningún ID en particular en la base de datos.

Robert Harvey
fuente
1
Piense dónde, en lugar de usar los modelos reales en el modelo de vista, InvoiceViewModel contiene solo otros modelos de vista (que están relacionados con los modelos).
Lawtonfogle
-1

De manera predeterminada, debe tener una identificación a la vista aunque no la esté usando. Cree una columna en la base de datos denominada como idy marque la auto incrementfunción sobre ella para que se ordene.

akash
fuente
1
Sin embargo, esto contradice directamente la otra respuesta, sin abordar por qué debería tener una identificación de todos modos .
Martijn Pieters