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

boi*_*222 7 c# asp.net-mvc asp.net-mvc-4

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

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

这是我想要做的基本想法:

在此输入图像描述

这是我的观点: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>
Run Code Online (Sandbox Code Playgroud)

这是控制器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);
    }
Run Code Online (Sandbox Code Playgroud)

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

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

    }
Run Code Online (Sandbox Code Playgroud)

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

        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");
    }
Run Code Online (Sandbox Code Playgroud)

Chr*_*att 13

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

在MVC中,有一种称为"子操作"的东西,因为你似乎想要部分到这里工作.通过使用Html.ActionHtml.RenderAction替代,您可以在控制器上调用此操作以返回部分视图.但有两件事:

  1. 如果你要返回一个局部视图(而不是一个完整的视图),那么你应该用它来装饰动作[ChildActionOnly].否则,操作将暴露给来自浏览器的直接URL访问,这将单独呈现局部视图,而不进行任何布局.

  2. 子操作只能用于GET样式的请求.您无法POST到子操作.

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

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

public class MyAwesomeViewModel // name doesn't matter
{
    public ModelApplication Application { get; set; }
    public ModelContract Contract { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的主视图中:

@model Namespace.To.MyAwesomeViewModel

...

@Html.Partial("ApplicationPartialView", Model.Application)
@Html.Partial("ContractPartialView", Model.Contract)
Run Code Online (Sandbox Code Playgroud)

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

[HttpPost]
public ActionResult CreateContract(MyAwesomeViewModel model)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)