Dans ASP.NET MVC, les modèles de vue doivent-ils avoir un ID?

11

Lorsque vous développez une application ASP.NET MVC qui permet la mise à jour du modèle, vous avez besoin d'un moyen de savoir comment prendre le modèle de vue mis à jour et le faire correspondre au modèle qui est maintenant mis à jour. Il semble y avoir plusieurs façons différentes de le faire et je me demande si certaines d'entre elles ne sont pas des MVC appropriées (tout comme avoir des données de stockage de votre contrôleur qui devraient être dans le modèle n'est pas une MVC appropriée)?

Tous les modèles de vue ont un ID: Pros

  • Assurez-vous toujours que vous pouvez vous adapter à votre modèle.

Les inconvénients

  • Vous devez être très prudent qu'aucun des ID n'a été modifié, sinon vous pouvez demander aux utilisateurs de mettre à jour les lignes auxquelles ils ne devraient pas avoir accès.

Seuls les modèles de vue minimale nue ont un ID: Pros

  • Beaucoup moins de vérification nécessaire pour éviter aux utilisateurs de mettre à jour des données auxquelles ils ne devraient pas accéder.

Les inconvénients

  • Il est beaucoup plus difficile de savoir quels modèles de vue correspondent à quel modèle.
  • Vous devez toujours vérifier les quelques modèles de vue avec des ID pour vous assurer que l'utilisateur ne met pas à jour les données auxquelles il ne devrait pas avoir accès.

Aucun modèle de vue n'a d'ID:

Avantages

  • Pas besoin de vérifier les identifiants pour les mises à jour.

Les inconvénients

  • Vous devez abandonner l'apatridie.

J'ai donc deux questions.

Tout d'abord, y a-t-il un choix correct / incorrect? (Sinon, cela signifie que le choix est une question d'opinion et ma deuxième question est basée sur l'opinion et doit être ignorée.)

Deuxièmement, s'il y a un choix correct / incorrect, quel est-il?

Pour clarifier un commentaire, je parle lorsque vous avez un modèle de vue qui est une imitation de votre objet de base de données.

Pensez ceci:

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?
}

pas ça:

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
la source
2
Que feriez-vous exactement avec un ID ViewModel? Les objets individuels dans le ViewModel n'ont-ils pas leur propre ID de toute façon?
Robert Harvey
Je devrais probablement spécifier uniquement lorsque le modèle de vue est lié à un modèle. Tous les modèles de vue ne sont pas liés.
Lawtonfogle
You have to abandon statelessness.- Vous venez de faire le choix d'utiliser MVC inutile.
Joel Etherton du
L'ID auquel vous faites référence ici est-il une clé primaire de base de données, ou autre chose que vous ajoutez au ViewModel?
Vermis
@Vermis, je pense qu'une clé primaire de base de données serait un simple identifiant. Un ID plus approfondi serait tout élément de données non modifiable qui vous permet de relier votre objet modifié à la version persistante non encore modifiée afin que les modifications modifiées puissent être persistées.
Lawtonfogle

Réponses:

1

L'objet ViewModel n'est généralement pas ce qui est stocké dans une table de base de données. Ce sont les éléments individuels de l'objet ViewModel qui sont stockés. Chacun de ces éléments a déjà un ID.

Par exemple:

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

Puisqu'il n'y a pas de table unique dans la base de données qui correspond à un InvoiceViewModel, il n'y a pas d'ID pour un objet InvoiceViewModel.

Bien sûr, vous pouvez toujours utiliser le InvoiceID comme identifiant pour ce ViewModel particulier. InvoiceID est pratique, car c'est ce que cet objet représente finalement. Mais je pouvais voir avoir un objet ViewModel qui ne correspond à aucun ID particulier dans la base de données.

Robert Harvey
la source
1
Pensez où au lieu d'utiliser les modèles réels dans le modèle de vue, InvoiceViewModel ne contient que d'autres modèles de vue (liés aux modèles).
Lawtonfogle
-1

Par défaut, vous devez avoir un identifiant en vue même si vous ne l'utilisez pas. Créez une colonne dans la base de données nommée comme idet cochez la auto incrementfonction dessus afin que vous soyez trié.

akash
la source
1
Cela contredit directement l'autre réponse cependant, sans expliquer pourquoi vous devriez avoir un identifiant de toute façon .
Martijn Pieters du