gpt4 book ai didi

c# - MVC - 提交按钮不适用于多个局部 View

转载 作者:太空狗 更新时间:2023-10-29 20:02:49 26 4
gpt4 key购买 nike

我是 MVC 的新手,所以请放轻松。我收到了一个在 MVC 中启动的项目,并被告知要添加到其中。在我到达需要来自两个不同模型的数据的部分之前,我一直很好。现在我被困住了,我的老板希望昨天完成这件事。如果可以,请帮忙。

我有一个包含两个局部 View 和一个提交按钮的 View 。每个局部 View 都使用不同的模型。 View 在屏幕上显示用户可以更改的信息。然后单击提交按钮。在 Controller 中,我想访问两个模型的数据(用户在屏幕上输入的值)。现在,我什至无法获得调用 Controller 的提交按钮。这是我需要立即帮助的部分,但我最终需要知道如何从 Controller 访问两个模型的数据。

这是我想做的事情的基本思路:

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>

这是 Controller CreateContractController.cs 的一部分。当 View 打开并正常工作时,将调用此方法。

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

obj_Contract.BuyerName = "MOCS";

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

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

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

}

这些是 Controller 中用于分部 View 的方法。这些也没有被调用。

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

最佳答案

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

在 MVC 中,有一种叫做“子 Action ”的东西,它可以像您希望的那样工作。通过使用 Html.ActionHtml.RenderAction,您可以在返回部分 View 的 Controller 上调用此操作。不过有两件事:

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

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

如果表单的这些单独区域将被发布到单独的位置,那么对于此类事情实际上最好只使用子操作来呈现表单的单独区域。以您同时具有登录或注册概念的组合页面为例。您可以使用子操作来呈现每个单独的字段组,但登录部分应该发布到登录操作,注册部分应该发布到注册操作。您不会将两种形式的所有内容都发布到同一操作。

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

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 操作会将此 View 模型作为参数:

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

关于c# - MVC - 提交按钮不适用于多个局部 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26282205/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com