如何向动作提交两个模型?

时间:2015-05-12 16:35:00

标签: asp.net-mvc asp.net-mvc-4

我遇到了一个我需要制作的问题。

带有自定义搜索按钮的主页/索引页面。

第一个案例 注册用户 - 在用户点击进行搜索后,它会重定向到部分视图的GET Payment/Index视图在其 UserData 内呈现,另一个部分视图使用Payment form,用户将填写其银行数据以支付搜索费用。

第二种情况 新用户 - 在用户点击它之后,它会重定向到GET付款/ IndexNewUser视图,其中部分视图呈现在{{ 1}}创建一个帐户和NewUser formPayment PartialView用户将填写其银行数据以支付搜索费用。两个表单都在同一个提交按钮中。

在第二种情况下,我需要先注册并验证用户并在之后付款。

我想到了这些选项:

1)在Payment form中创建ActionResult RegisteredUserPay(Payment model)和其他ActionResult NewUerPay(NewUserPayment model),在第二个动作中制作两件事,注册用户并付款。

2)继续使用Payment Controller上的ActionResult Pay(Payment model),当新用户提交时,将帖子发送到PaymentController上的ActionResult CreateUser(RegisterViewModel model),然后制作{{} 1}}。

从架构的角度来看,这两种情况都很奇怪,因为在第一个选项中,PaymentController将负责注册用户。而在另一种情况下,我将需要创建两个基本相同的视图,但对于不同的模型。

最好的方法是什么?

1 个答案:

答案 0 :(得分:2)

我认为你太复杂了。您只需要一个视图模型:

public class SearchPayViewModel
{
    public RegisterViewModel Register { get; set; }
    public Payment Payment { get; set; }
}

您只需要一个操作和一个视图。在您的视图中,只需分析用户是否经过身份验证,并且只渲染部分寄存器,如果不是:

@if (!User.Identity.IsAuthenticated)
{
    @Html.Partial("_Register", model.Register)
}

在帖子上,如果没有发布任何内容,model.Register将为null,显然如果未呈现寄存器部分,则不会发布任何内容。因此,您可以进行简单的检查,看看是否需要创建用户:

if (model.Register != null)
{
    // create user
}