在 MVC/Razor 中,如何打开一个新视图而不是局部视图?
In MVC/Razor, how can you open a new view instead of as a partial view?
我有一个使用 Razor 的 MVC 项目。页面上有一个局部视图的视图。我在部分视图中有一个按钮可以更新部分视图。这很好用。但是,我在视图中有另一个按钮,我想打开一个新视图;到 "break out" 的原始视图。相反,这个新视图会在部分页面应该打开的位置打开。我如何"break out"的父视图打开一个新视图?
这是我之前的问题:
这是详细信息。我有一个局部视图的视图。单击 ButtonB 从数据库中获取一些数据;那里一切正常。
-------------------------------------------------
| |
| MerchantApplicationSummary.cshtml |
| |
| |
| PartialDiv |
| ----------------------------------- |
| | ApplicationReportPartial.cshtml | |
| | | |
| | [Button B] | |
| ----------------------------------- |
| |
| [Button A] |
-------------------------------------------------
当我点击按钮 A 时,我想打开一个全新的视图:
-------------------------------------------------
| |
| PrintApplication.cshtml |
| |
| |
-------------------------------------------------
相反,我在部分视图所在的位置打开了视图:
-------------------------------------------------
| |
| MerchantApplicationSummary.cshtml |
| |
| |
| PartialDiv |
| ----------------------------------- |
| | PrintApplication.cshtml | |
| | | |
| ----------------------------------- |
| |
| [Button A] |
| |
-------------------------------------------------
我认为这种行为来自于将 UpdateTargetId 设置为在原始页面上的 div 内输出部分页面。我需要这个,以便 ApplicationReportPartial 在正确的位置打开。
MerchantApplicationSummary.cshtml
@using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "PartialDiv" }))
{
...
<div id="PartialDiv">
@{
Html.RenderPartial("ApplicationReportPartial");
}
</div>
...
}
这是检查它是来自按钮 A 还是按钮 B 的控制器:
AdminController.cs
[AuthorizeAdmin]
[HttpPost]
public ActionResult MerchantApplicationSummary(string[] ints, FormCollection form, int? page, string submit)
{
if (ints != null && (submit == "Print Spanish Application(s)" || submit == "Print Application(s)"))
{
return View(@"~/Views/Admin/PrintApplication.cshtml");
}
else
{
...
return PartialView("ApplicationReportPartial", obj_MrntApp);
}
如何保留它以便 ApplicationReportPartial 在 MerchantApplicationSummary 中打开,但 PrintApplication 在新视图中打开?
编辑:
这是按钮 A 的代码:
<input id="Submit" name="submit" type="submit" class="btn btn-primary" value="Print Application(s)" />
我确实有按钮 A 作为一个动作 link,但我需要它来使它成为一个提交按钮来传递某些值。又是这个动作:
public ActionResult MerchantApplicationSummary(string[] ints, FormCollection form, int? page, string submit)
当我点击按钮 A 时,我需要整数值; ints 是页面上选中的复选框的 ID 数组。如果我使用操作 link,我将如何将这些值传递给操作? -- 我做了一些研究,看起来这是不可能的(参见 http://forums.asp.net/t/1470988.aspx?HTML+ActionLink+to+post)所以这让我回到了我最初的问题,即如何 "break out" 父视图。
执行标准表单提交并return重定向响应。
MerchantApplicationSummary.cshtml
@(Html.BeginForm("PrintApplication", "Admin", FormMethod.Post)) {
...
<button type="submit" id="buttonA">Print</button>
}
你的控制器将是
[HttpPost]
public ActionResult PrintApplication(FormCollection form)
{
// do stuff with form
...
// stash data you need in redirected view
TempData["PrintApplication.Id"] = id;
return RedirectToAction("PrintApplication");
}
[HttpGet]
public ActionResult PrintApplication()
{
int? id = TempData["PrintApplication.Id"] as int?;
ViewBag.Id = id.Value;
return View("PrintApplication");
}
您将表单和 RedirectToAction returns 302 Found
提交到浏览器,它将重定向到 GET PrintApplication
操作。
如果您需要与您的 MerchantApplicationSummary
AJAX post 共享表格,这里比较麻烦。删除 AjaxHelper
.
可能是最简单的
<div id="appForms">
@(Html.BeginForm("PrintApplication", "ControllerName",
FormMethod.Post), new { id = "formId" }) {
<div id="PartialDiv">
@{ Html.RenderPartial("ApplicationReportPartial"); }
</div>
...
<button type="submit" id="buttonA">Print</button>
}
</div>
然后连接按钮 B 以触发 jquery AJAX post。确保按钮 B 不是提交按钮(例如 <input type="submit">
或 <button type="submit">
)。
$("#appForms").on("click", "#buttonB", function(event) {
var data = $("#formId").serialize();
$.ajax({
url: "/Admin/MerchantApplicationSummary",
method: "POST",
data: data,
success: function(partialViewResult) {
$("#PartialDiv").html(partialViewResult);
}
});
});
然后从 MerchantApplicationSummary
.
中删除所有 PrintApplication
逻辑
我对你的细节了解不够,所以你可能需要在这里做一些调整。
我通过执行以下操作解决了问题:
- 在父视图中,我使用 BeginForm 而不是 Ajax.BeginForm 并停止了 UpdateTargetId 分配。
- 在控制器中,返回局部视图的视图而不是局部视图。
MerchantApplicationSummary.cshtml
@using (Html.BeginForm("MerchantApplicationSummary", "Admin"))
{
...
<div id="PartialDiv">
@{
Html.RenderPartial("ApplicationReportPartial");
}
</div>
...
<input id="Submit" name="submit" type="submit" class="btn btn-primary" value="Print Application(s)" />
}
AdminController.cs
[AuthorizeAdmin]
[HttpPost]
public ActionResult MerchantApplicationSummary(string[] ints, FormCollection form, int? page, string submit, string PrintApplications)
{
if (ints != null && (submit == "Print Spanish Application(s)" || submit == "Print Application(s)"))
{
...
return View(@"~/Views/Admin/PrintApplication.cshtml");
}
else
{
...
return View(obj_MrntApp);
}
}
我有一个使用 Razor 的 MVC 项目。页面上有一个局部视图的视图。我在部分视图中有一个按钮可以更新部分视图。这很好用。但是,我在视图中有另一个按钮,我想打开一个新视图;到 "break out" 的原始视图。相反,这个新视图会在部分页面应该打开的位置打开。我如何"break out"的父视图打开一个新视图?
这是我之前的问题:
这是详细信息。我有一个局部视图的视图。单击 ButtonB 从数据库中获取一些数据;那里一切正常。
-------------------------------------------------
| |
| MerchantApplicationSummary.cshtml |
| |
| |
| PartialDiv |
| ----------------------------------- |
| | ApplicationReportPartial.cshtml | |
| | | |
| | [Button B] | |
| ----------------------------------- |
| |
| [Button A] |
-------------------------------------------------
当我点击按钮 A 时,我想打开一个全新的视图:
-------------------------------------------------
| |
| PrintApplication.cshtml |
| |
| |
-------------------------------------------------
相反,我在部分视图所在的位置打开了视图:
-------------------------------------------------
| |
| MerchantApplicationSummary.cshtml |
| |
| |
| PartialDiv |
| ----------------------------------- |
| | PrintApplication.cshtml | |
| | | |
| ----------------------------------- |
| |
| [Button A] |
| |
-------------------------------------------------
我认为这种行为来自于将 UpdateTargetId 设置为在原始页面上的 div 内输出部分页面。我需要这个,以便 ApplicationReportPartial 在正确的位置打开。
MerchantApplicationSummary.cshtml
@using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "PartialDiv" }))
{
...
<div id="PartialDiv">
@{
Html.RenderPartial("ApplicationReportPartial");
}
</div>
...
}
这是检查它是来自按钮 A 还是按钮 B 的控制器:
AdminController.cs
[AuthorizeAdmin]
[HttpPost]
public ActionResult MerchantApplicationSummary(string[] ints, FormCollection form, int? page, string submit)
{
if (ints != null && (submit == "Print Spanish Application(s)" || submit == "Print Application(s)"))
{
return View(@"~/Views/Admin/PrintApplication.cshtml");
}
else
{
...
return PartialView("ApplicationReportPartial", obj_MrntApp);
}
如何保留它以便 ApplicationReportPartial 在 MerchantApplicationSummary 中打开,但 PrintApplication 在新视图中打开?
编辑:
这是按钮 A 的代码:
<input id="Submit" name="submit" type="submit" class="btn btn-primary" value="Print Application(s)" />
我确实有按钮 A 作为一个动作 link,但我需要它来使它成为一个提交按钮来传递某些值。又是这个动作:
public ActionResult MerchantApplicationSummary(string[] ints, FormCollection form, int? page, string submit)
当我点击按钮 A 时,我需要整数值; ints 是页面上选中的复选框的 ID 数组。如果我使用操作 link,我将如何将这些值传递给操作? -- 我做了一些研究,看起来这是不可能的(参见 http://forums.asp.net/t/1470988.aspx?HTML+ActionLink+to+post)所以这让我回到了我最初的问题,即如何 "break out" 父视图。
执行标准表单提交并return重定向响应。
MerchantApplicationSummary.cshtml
@(Html.BeginForm("PrintApplication", "Admin", FormMethod.Post)) {
...
<button type="submit" id="buttonA">Print</button>
}
你的控制器将是
[HttpPost]
public ActionResult PrintApplication(FormCollection form)
{
// do stuff with form
...
// stash data you need in redirected view
TempData["PrintApplication.Id"] = id;
return RedirectToAction("PrintApplication");
}
[HttpGet]
public ActionResult PrintApplication()
{
int? id = TempData["PrintApplication.Id"] as int?;
ViewBag.Id = id.Value;
return View("PrintApplication");
}
您将表单和 RedirectToAction returns 302 Found
提交到浏览器,它将重定向到 GET PrintApplication
操作。
如果您需要与您的 MerchantApplicationSummary
AJAX post 共享表格,这里比较麻烦。删除 AjaxHelper
.
<div id="appForms">
@(Html.BeginForm("PrintApplication", "ControllerName",
FormMethod.Post), new { id = "formId" }) {
<div id="PartialDiv">
@{ Html.RenderPartial("ApplicationReportPartial"); }
</div>
...
<button type="submit" id="buttonA">Print</button>
}
</div>
然后连接按钮 B 以触发 jquery AJAX post。确保按钮 B 不是提交按钮(例如 <input type="submit">
或 <button type="submit">
)。
$("#appForms").on("click", "#buttonB", function(event) {
var data = $("#formId").serialize();
$.ajax({
url: "/Admin/MerchantApplicationSummary",
method: "POST",
data: data,
success: function(partialViewResult) {
$("#PartialDiv").html(partialViewResult);
}
});
});
然后从 MerchantApplicationSummary
.
PrintApplication
逻辑
我对你的细节了解不够,所以你可能需要在这里做一些调整。
我通过执行以下操作解决了问题: - 在父视图中,我使用 BeginForm 而不是 Ajax.BeginForm 并停止了 UpdateTargetId 分配。 - 在控制器中,返回局部视图的视图而不是局部视图。
MerchantApplicationSummary.cshtml
@using (Html.BeginForm("MerchantApplicationSummary", "Admin"))
{
...
<div id="PartialDiv">
@{
Html.RenderPartial("ApplicationReportPartial");
}
</div>
...
<input id="Submit" name="submit" type="submit" class="btn btn-primary" value="Print Application(s)" />
}
AdminController.cs
[AuthorizeAdmin]
[HttpPost]
public ActionResult MerchantApplicationSummary(string[] ints, FormCollection form, int? page, string submit, string PrintApplications)
{
if (ints != null && (submit == "Print Spanish Application(s)" || submit == "Print Application(s)"))
{
...
return View(@"~/Views/Admin/PrintApplication.cshtml");
}
else
{
...
return View(obj_MrntApp);
}
}