【问题标题】:MVC - Submit button not working with multiple partial viewsMVC - 提交按钮不适用于多个局部视图
【发布时间】:2014-12-14 18:54:07
【问题描述】:

我是 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 的一部分。当视图打开并正常工作时会触发此方法。

        [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");
    }

【问题讨论】:

  • CreateContract 的 Post 版本以前工作过吗?我猜答案是否定的。它可能需要获取 ModelContract 的实例,以便从表单中获取详细信息。
  • 我要更改的第一件事是您的提交控件。我会把它作为一个按钮而不是一个输入。试试看它是否开始调用你的控制器动作。
  • Pheonyx:当我将其更改为按钮时,我收到此错误:“传入字典的模型项的类型为'CarmelFinancialWeb.Models.ModelContract',但此字典需要一个模型项输入“CarmelFinancialWeb.Models.ModelApplication”。”
  • Daniel Hollinrake:在我没有部分观点之前,帖子版本确实有效。我尝试将 ModelContract 添加为变量,但没有成功:[HttpPost]public ActionResult CreateContract(ModelContract con){}
  • 那些局部视图中有什么?当您将它们取出时,帖子是否有效?

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


【解决方案1】:

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

在 MVC 中,有一种叫做“子动作”的东西,它的工作方式似乎是你想要的部分。通过改用Html.ActionHtml.RenderAction,您可以在返回部分视图的控制器上调用此操作。不过有两件事:

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

  2. 子操作只能用于 GET 样式的请求。您不能 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)
{
    ...
}

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多