MVC - 提交按钮不能处理多个部分视图

时间:2014-10-09 15:23:49

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

我是MVC的新手,所以请放轻松我。我收到了一个在MVC中启动的项目,并被告知要添加它。我很好,直到我得到一个需要两个不同模型的数据的部分。现在我被困了,我的老板昨天想要这样做。如果可以,请帮忙。

我有一个包含两个部分视图和一个提交按钮的视图。每个部分视图使用不同的模型。视图在屏幕上显示用户可以改变的信息。然后单击提交按钮。在控制器中,我想访问两个模型中的数据(用户在屏幕上输入的值)。现在,我甚至无法通过提交按钮来呼叫控制器。这是我需要立即帮助的部分,但我最终需要知道如何从控制器访问两个模型的数据。

以下是我想要做的基本想法:

enter image description here

这是我的观点:CreateContract.cshtml

<div class="container-fluid">
@using (Html.BeginForm("CreateContract", "CreateContract", FormMethod.Post, new { @class = "form-horizontal " }))
{
                <div id="PartialDiv">
            @{
        Html.RenderPartial("ApplicationPartialView", new CarmelFinancialWeb.Models.ModelApplication());
        Html.RenderPartial("ContractPartialView");
            }
        </div>
            <input id="btnCreateContract" type="submit" class="btn btn-primary" value="Save" name="CreateContract" />
}
    </div>

这是控制器CreateContractController.cs的一部分。当视图打开并且工作正常时,会触发此方法。

        [AuthorizeAdmin]
    public ActionResult CreateContract(string ID)
    {
        ModelContract obj_Contract = new ModelContract();

        obj_Contract.BuyerName = "MOCS";

        return View(@"~/Views/CreateContract/CreateContract.cshtml", obj_Contract);
    }

这是控制器CreateContractController.cs的一部分。单击提交按钮时,不会触发此方法。我尝试过包含其他方法的字符串ID变量以及ModelContract和ModelApplication(及其各种组合),但我无法调用此方法。

        [AuthorizeAdmin]
    [HttpPost]
    public ActionResult CreateContract()
    {
         ModelApplication obj_App = new ModelApplication();
         return View(@"~/Views/CreateContract/CreateContract.cshtml", obj_App);

    }

这些是部分视图的控制器中的方法。这些都没有被调用。

        public PartialViewResult ApplicationPartialView(string ID)
    {
        ModelApplication obj_App = new ModelApplication();

        if (ID != null && ID != "0" && ID != null && ID != "")
        {
            obj_App = objBllApplication.GetApplicationByID(int.Parse(ID));
        }

        return PartialView("CreateContractApplicationPartialView");
    }

    public PartialViewResult ContractContractPartialView()
    {
        ModelContract obj_Contract = new ModelContract();

        obj_Contract.DealerID = "MOCS";

        return PartialView("CreateContractContractPartialView");
    }

1 个答案:

答案 0 :(得分:13)

这里有很多内容,这对你有所帮助,特别是因为你对此不熟悉。首先,视图只能有一个模型。高级别的原因是它实际上通过一个通用类来呈现所选模型作为其类型填充。你可以通过使用部分视图来欺骗你,但是你仍然必须将模型实例纳入其中。它似乎是你试图通过在你的控制器中创建动作来代表那些部分来做到这一点,但这些实际上是没用的。他们永远不会被召唤。 Html.PartialHtml.RenderPartial将仅显示指定视图,默认情况下使用与调用视图相同的模型,或者作为模型传递给这些方法的对象(第二个参数)。它不会回到控制器。

在MVC中,有一些名为&#34; child actions&#34;因为你似乎想要分手到这里工作。通过使用Html.ActionHtml.RenderAction,您可以在控制器上调用此操作以返回部分视图。但有两件事:

  1. 如果您要返回部分视图(而不是完整视图),则应使用[ChildActionOnly]修饰操作。否则,操作将暴露给浏览器的直接URL访问,这将单独呈现局部视图,而不进行任何布局。

  2. 子操作只能用于GET样式的请求。您无法发布到儿童行动。

  3. 对于这样的事情来说,它实际上是最好的,如果表单的各个区域将被发布到不同的位置,则仅使用子操作来呈现表单的单独区域。以组合页面为例,您可以同时拥有登录或注册概念。您可以使用子操作来呈现每个单独的字段组,但登录部分应POST到登录操作,并且注册部分应发布到注册操作。你不会将从两种形式的所有内容都发布到相同的动作。

    在您的特定场景中,部分视图实际上是要走的路,但您只需要将主视图的模型调整为包含两个子模型的视图模型。例如:

    public class MyAwesomeViewModel // name doesn't matter
    {
        public ModelApplication Application { get; set; }
        public ModelContract Contract { get; set; }
    }
    

    然后,在您的主视图中:

    @model Namespace.To.MyAwesomeViewModel
    
    ...
    
    @Html.Partial("ApplicationPartialView", Model.Application)
    @Html.Partial("ContractPartialView", Model.Contract)
    

    最后,您的POST操作会将此视图模型作为参数:

    [HttpPost]
    public ActionResult CreateContract(MyAwesomeViewModel model)
    {
        ...
    }