C# MVC-提交按钮不适用于多个局部视图

C# MVC-提交按钮不适用于多个局部视图,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我是MVC的新手,所以请对我放松点。我收到了一个在MVC中启动的项目,并被告知要添加到该项目中。我很好,直到我到达一个需要两个不同模型数据的部分。现在我被困住了,我的老板要我昨天把这事做完。如果可以的话,请帮忙 我有一个包含两个局部视图和一个提交按钮的视图。每个局部视图使用不同的模型。视图在屏幕上显示用户可以更改的信息。然后单击提交按钮。在控制器中,我希望访问两个模型的数据(用户在屏幕上输入的值)。现在,我甚至无法通过“提交”按钮呼叫控制器。这是我需要立即帮助的部分,但我最终需要知道如何从控制器

我是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>
这是控制器CreateContractController.cs的一部分。单击“提交”按钮时,不会点击此方法。我尝试过包含来自另一个方法的string 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");
    }

这里有很多事情要做,这对你来说是有益的,尤其是因为你是新手。首先,一个视图只能有一个模型。高级原因是,它实际上是通过所选模型作为其类型填充的泛型类来呈现的。在这里,您可以通过使用局部视图进行某种程度的欺骗,但您仍然必须在这些视图中获取模型实例。看起来您正试图通过在控制器中创建动作来表示这些部分来实现这一点,但这些实际上是无用的。他们永远不会被召唤
Html.Partial
Html.RenderPartial
将只渲染指定的视图,默认情况下使用与调用视图相同的模型,或者将对象作为模型(第二个参数)传递给这些方法。它不会返回控制器

在MVC中,有一种称为“子操作”的东西,它的工作方式与您希望在这里使用的部分一样。通过使用
Html.Action
Html.RenderAction
,您可以在返回部分视图的控制器上调用此操作。但有两件事:

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

  • 子操作只能用于获取样式请求。您不能发布到子操作

  • 实际上,最好是这样,如果表单的各个区域将被发布到不同的位置,则只使用子操作来呈现表单的各个区域。以一个组合页面为例,在该页面中,您同时拥有登录或注册概念。您可以使用子操作呈现每个单独的字段组,但是登录部分应该发布到登录操作,注册部分应该发布到注册操作。你不会发布从两个表单到同一个动作的所有内容

    在您的特定场景中,部分视图实际上是一种方法,但是您只需要调整主视图的模型,使其成为包含两个子模型的视图模型。例如:

    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)
    {
        ...
    }
    

    CreateContract的后期版本以前有用吗?我猜答案是否定的。它可能需要以ModelContract为例,以便从表单中获取详细信息。我要更改的第一件事是您的提交控件。我会把它作为一个按钮,而不是一个输入。尝试一下,看看它是否开始调用您的控制器操作。Pheonx:当我将其更改为按钮时,我得到以下错误:“传递到字典中的模型项的类型为'CarmelFinancialWeb.Models.ModelContract',但此字典需要'CarmelFinancialWeb.Models.ModelApplication'类型的模型项。”丹尼尔·霍林瑞克:在我没有部分观点的情况下,后期版本确实有效。我尝试将ModelContract添加为变量,但没有成功:[HttpPost]公共操作结果CreateContract(ModelContract con){}这些局部视图中有什么?当你把它们拿出来的时候,它们还能用吗?
    [HttpPost]
    public ActionResult CreateContract(MyAwesomeViewModel model)
    {
        ...
    }