接受两个模型作为动作方法参数

时间:2014-01-18 20:51:08

标签: c# .net asp.net-mvc model controller

我正在开发一个MVC网站,我有一个付款表格,其中包括客户信息和付款信息。我没有在我的数据库中存储付款信息,所以我不想将其添加到我的客户信息模型中。如果我能做这样的事情会很好:

public void PaymentConfirmation(CustomerInfo customer, PaymentInfo payment)
{
    //do stuff
}

但我不认为默认情况下mvc模型绑定器会执行类似的操作。处理这种情况的最佳做法是什么?

1 个答案:

答案 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" />