问题:要使此黑客正常工作,我缺少什么?

对于我正在开发的MVC应用程序,我遇到了一个“异常”案例。

我们使用ActiveReports生成某些报告,并为允许的用户在我们的布局上显示一个ActionLink,该ActionLink允许访问这些报告,并在新窗口中打开。该项目的方向是所有报告都应在新窗口中打开。

但是,有一个离群值我无法应用简单的ActionLink修复程序,因为我们使用覆盖层(几乎由下拉列表和文本字段组成)访问此报表。这些内容的组合被馈送到控制器,该控制器根据给定的条件将重定向返回到操作(有一些特定的检查仅应在服务器上进行,因此为什么我们不只是在此叠加层的JavaScript中执行此操作对话。)

现在,我不是一个让MVC这样的局限性不能(直接)允许我重定向到新Window阻止我的人,所以我尝试了给定的JavaScriptResult hack,因为这已经是一种失败的情况了,看来尽管是骇客,但却是解决我的问题的最简单,最可维护的解决方案:

public ActionResult GenerateFooReport(string someInfo)
{
    // HACK: MVC does not allow redirects to open a new window, so
    //       return some JavaScript that forces a new window open.
    string script = "window.open('/controller/action?param=" + someInfo + "');";
    return JavaScript(script);
}


当然,当我运行导致该方法触发的动作(Foo的输入,正确的下拉选项)时,会看到以下输出:

window.open('/controller/action?param=foo')


...而不是有关那段JavaScript应该自动打开的报告。

尽管我了解到这种用法(在大多数情况下)被视为反模式,但我不能随意修改UI以适应更可接受的用法。

问题:要使此黑客正常工作,我缺少什么?

编辑:尝试了一种替代的实现,也没有用:

private ActionResult GenerateFooReport(string someInfo)
{
    // HACK: MVC does not allow redirects to open a new window, so
    //       return some JavaScript that forces a new window open.
    string script = "<script>window.open('/controller/action?param=" + someInfo + "');</script>";
    return Content(script);
}


同样没有效果。

编辑:黑客的另一个失败尝试:

private ActionResult GenerateFooReport(string someInfo)
{
    // HACK: MVC does not allow redirects to open a new window, so
    //       return a redirect to a url that executes javascript that
    //       opens the new window.
    string script = "javascript:window.open('/controller/action?param=" + someInfo + "');";
    return Redirect(script);
}


编辑:这种情况的弊病产生了很大的影响!新的方向已成为避免在控制器中执行这些有害操作,而是使用JavaScript进行操作的新方向。话虽这么说,但我仍然对真正使黑客工作的方式感到好奇,仅出于我自己的兴趣。

最佳答案

尝试直接调用jquery .load函数。

return JavaScript("$('#targetdiv').load('controller/action?param="+someInfo+"');");

10-06 07:50