我正在开发一个MVC网站,我有一个付款表格,其中包括客户信息和付款信息。我没有在我的数据库中存储付款信息,所以我不想将其添加到我的客户信息模型中。如果我能做这样的事情会很好:
public void PaymentConfirmation(CustomerInfo customer, PaymentInfo payment)
{
//do stuff
}
但我不认为默认情况下mvc模型绑定器会执行类似的操作。处理这种情况的最佳做法是什么?
答案 0 :(得分:1)
我假设当你说
我没有在我的数据库中存储付款信息,所以我不想添加 其中任何一个都是我的客户信息模型。
您的意思是您的客户模型是域模型(从EF或其他ORM生成)。如果不使用ORM,单一责任原则仍然起作用,因为PaymentInfo
实际上与CustomerInfo
无关,并且应该有自己的基类。不将这些组合成一个大的“做一切”课程是有道理的。
但是,您可以为此特定视图创建一个ViewModel,其中包含您需要的所有信息。这不会导致数据库更改,并且基本上是视图执行任何操作所需的所有数据的简单包装器。一个基本的例子是
public class PaymentConfirmationViewModel{
public CustomerInfo Customer {get;set;}
public PaymentInfo Payment {get;set;}
}
正如您所看到的,我们将两个独立的类包装成一个供视图/操作结果使用。但是,使用“视图模型”可以完全自定义和限制/添加视图可用的信息。这意味着,如果域模型上存在视图不需要的属性,则不要将它们作为视图模型的一部分。
现在,您的控制器方法将是
public void PaymentConfirmation(PaymentConfirmationViewModel model)
{
//do stuff
}
您需要更改的唯一其他项目是您的视图,因为您的Html助手需要稍微不同的lambda表达式(随机示例)。
@Html.LabelFor(x=>x.FirstName)
会变成
@Html.LabelFor(x=>x.Customer.FirstName)
如果您在原始HTML中手动创建输入字段,则会发生以下更新。
<input type="text" id="FirstName" name="FirstName" />
将成为(请注意输入字段的 ID 属性中的下划线)
<input type="text" id="Customer_FirstName" name="Customer.FirstName" />