(可选)在控制器Action中打开一个新窗口

时间:2011-03-23 13:07:15

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

在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,则显示错误的视图将显示在新窗口中,并且原始窗口将重定向到其他位置。

1 个答案:

答案 0 :(得分:1)

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

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