【问题标题】:Optionally open a new window in controller Action可选择在控制器操作中打开一个新窗口
【发布时间】:2011-03-23 13:07:14
【问题描述】:

在 ASP.Net MVC 2 应用程序中,我想要执行以下操作:在处理表单发布的操作中,我想要:

  • 将用户重定向到当前浏览器窗口中的其他视图
  • 打开一个显示其他信息的新窗口(其他视图)

这可以很容易地在表单元素中设置target="_blank" 属性并添加以下jQuery 脚本:

$(function () {
    $("form").submit(function () {
        window.location = "...";
    });
});

操作处理程序返回的视图将在表单发布到的新窗口中呈现。

但是,让我们让它变得更棘手:

  • 如果执行该操作时没有服务层错误,则执行上述操作。
  • 如果执行动作时出现任何服务层错误,则不要打开新窗口,动作返回的视图必须显示在最初表单所在的同一窗口中。

例如:假设服务层生成一个 pdfDocument 以向用户显示一切是否正常,并且该 pdf 必须在新窗口中显示。

[HttpPost]
public ActionResult SomeAction(FormCollection form)
{
    var serviceMethodParams = ... // convertion from the form data somehow

    MemoryStream pdfDocument = null;

    if (!serviceLayer.DoSomething(serviceMethodParams, out pdfDocument))
    {
        // Something went wrong, do not redirect, do not open new window
        // Return the same view where error should be displayed
        return View(...);
    }

    // The service method run ok, this must be shown in a new window and the origal window must be redirected somewhere else
    return File(pdfDocument.ToArray(), "application/pdf");
}

请注意,当服务返回 true 时,原始解决方案可以正常工作,但如果服务返回 false,则显示错误的视图会显示在新窗口中,并且原始窗口会重定向到其他位置。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2


    【解决方案1】:

    在这种情况下,更好的选择是简单地返回一个特定于该文档的 URL 以供用户指向,并且您的 ajax 调用在成功时获取从您的操作方法返回的 URL,然后打开一个新的指向该 URL 的窗口本身。出错时,您可以显示错误或类似的错误 - 基本上,该数据被折叠在 Json 返回值中。

    在 ajax 调用之外,对我来说最可接受的模式是让视图重新呈现,然后附加一些启动 javascript 以打开指向该特定 URL 的新窗口。

    【讨论】:

      猜你喜欢
      • 2011-12-09
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      相关资源
      最近更新 更多