【发布时间】:2013-03-05 15:43:30
【问题描述】:
问题:要让这个 hack 起作用,我缺少什么?
对于我正在开发的 MVC 应用程序,我遇到了一个“不寻常”的案例。
我们使用 ActiveReports 生成某些报告,并且对于被允许的用户,在我们的布局上显示一个 ActionLink 以允许访问这些报告,这些报告在新窗口中打开。该项目的方向是所有报告应在新窗口中打开。
但是,有一个异常值我无法应用简单的 ActionLink 修复,因为我们使用由几乎一个下拉列表和一个文本字段组成的覆盖来访问此报告。这些组合被馈送到控制器,该控制器根据给定条件返回对动作的重定向(有一些特定的检查应该只发生在服务器上,因此我们不只是在这个覆盖层上的 JavaScript 中执行此操作对话。)
现在,我不想让像 MVC 这样的小限制(直接)不允许我重定向到新窗口阻止我,所以我尝试了给定的 JavaScriptResult hack,因为这已经是一种过时的情况,尽管它是一个 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 以适应更可接受的用法。
问题:要让这个 hack 起作用,我缺少什么?
编辑:尝试了一个同样无效的替代实现:
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 发挥作用的实际方法感到好奇,只是为了我自己的启迪。
【问题讨论】:
-
你的控制器为什么要做这个工作?它应该只是一个动作链接上的点击事件。
-
这是对旧应用程序的重写,该应用程序具有此“仪表板”,如果选择了某个下拉操作,将打开报告而不是输入表单。该指令是网络应用程序的行为应该像旧应用程序一样,因此我必须这样做(邪恶,可怕)的方式。如果可以的话,我会在适当的地方添加 ActionLinks 并洗手。
-
是的,这很好,但你不能用一个 JavaScript 函数替换控制器动作吗?给定参数只调用
window.open的东西? -
还有一些其他条件需要在服务器上进行评估,无论如何都超出了我的问题范围。这里的限制与其说是技术限制,不如说是商业限制,因此是邪恶的黑客攻击。
-
弹出窗口可能被阻止..
标签: javascript asp.net-mvc-3 new-window