问题:让这个黑客工作我缺少什么?
对于我正在开发的 MVC 应用程序,我遇到了一个“不寻常”的案例。
我们使用 ActiveReports 生成某些报告,对于被允许的用户,在我们的布局上显示一个 ActionLink,允许访问这些报告,这些报告在新窗口中打开。该项目的方向是所有报告都应在新窗口中打开。
但是,有一个异常值我无法应用简单的 ActionLink 修复,因为我们使用由几乎一个下拉列表和一个文本字段组成的覆盖来访问此报告。这些组合被馈送到控制器,该控制器根据给定条件返回对动作的重定向(有一些特定的检查应该只发生在服务器上,因此我们不只是在这个覆盖层上的 JavaScript 中执行此操作对话。)
现在,我不想让像 MVC 这样的小限制(直接)不允许我重定向到新窗口阻止我,所以我尝试了给定的 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 中执行它们。话虽如此,我仍然对让 hack 工作的实际方法感到好奇,只是为了我自己的启迪。