问题:要使此黑客正常工作,我缺少什么?
对于我正在开发的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+"');");