在ASP.NET MVC中,视图模型是否应具有ID?


11

在开发允许更新模型的ASP.NET MVC应用程序时,您需要某种方式来了解如何获取更新的视图模型并将其与现在更新的模型匹配。似乎有几种不同的方法可以做到这一点,我想知道这些方法中是否有任何一种不正确的MVC(就像让控制器存储应在模型中存储的数据是不正确的MVC)?

所有视图模型都有一个ID:优点

  • 始终确保可以匹配您的模型。

缺点

  • 您必须非常小心,不要更改任何ID,否则您可以让用户更新他们不应该访问的行。

只有最基本的视图模型具有ID:优点

  • 避免用户更新他们不应访问的数据所需的检查要少得多。

缺点

  • 跟踪哪种视图模型与哪种模型匹配要困难得多。
  • 您仍然必须检查一些具有ID的视图模型,以确保用户不会更新他们不应该访问的数据。

没有视图模型具有ID:

优点

  • 无需检查ID以进行更新。

缺点

  • 您必须放弃无国籍状态。

所以我有两个问题。

首先,是否有正确/错误的选择?(如果不是,则表示选择只是一个见解,我的第二个问题是基于见解,应该忽略。)

其次,如果有正确/错误的选择,那是什么?

为了澄清评论,我在说的是当您拥有一个类似于数据库对象的视图模型时。

认为:

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

不是这个:

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

2
您将如何使用ViewModel ID?无论如何,ViewModel中的各个对象都没有自己的ID吗?
罗伯特·哈维

我应该只在视图模型与模型相关时指定。并非所有视图模型都相关。
Lawtonfogle 2014年

You have to abandon statelessness.-您刚刚选择了毫无意义地使用MVC。
乔尔·埃瑟顿

您在此处引用的ID是数据库主键,还是要添加到ViewModel的其他内容?
Vermis 2014年

@Vermis,我认为数据库主键将是一个简单的ID。更为详尽的ID是任何不可修改的数据,它使您可以将已编辑的对象与尚未编辑的持久化版本相关联,以便可以持久保存已编辑的更改。
Lawtonfogle 2014年

Answers:


1

通常,ViewModel对象不是存储在数据库表中的对象。 存储的是ViewModel对象中的各个项目。 这些项目中的每一个都已经有一个ID。

例如:

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

由于数据库中没有与InvoiceViewModel对应的单个表,因此InvoiceViewModel对象没有ID。

当然,您始终可以将InvoiceID用作此特定ViewModel的ID。InvoiceID很方便,因为这就是该对象最终代表的内容。但是我可以看到有一个ViewModel对象与数据库中的任何特定ID不对应。


1
考虑一下InvoiceViewModel不在哪里使用视图模型中的实际模型,而只包含其他视图模型(与模型有关)。
Lawtonfogle 2014年

-1

默认情况下,即使您没有使用ID,您也应该在视图中看到它。在名为as的数据库中创建一列,id然后auto increment在其上打勾,以对您进行排序。


1
但是,这直接与另一个答案相矛盾,却没有说明为什么仍然要有一个id 。
马丁·皮特斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.