在开发允许更新模型的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年