问题:我错过了什么让这个黑客工作?
对于我正在研究的MVC应用程序,我遇到了一个“不寻常”的案例。
我们使用ActiveReports生成某些报告,对于允许的用户,在我们的布局上显示ActionLink,允许访问在新窗口中打开的这些报告。该项目的方向是所有报告将在新窗口中打开。
但是,有一个异常值我无法应用简单的ActionLink修复程序,因为我们使用包含几乎下拉列表和文本字段的叠加层来访问此报表。这些组合被送到控制器,控制器根据给定的条件返回一个动作的重定向(有一些特定的检查只应该发生在服务器上,因此我们不能在这个叠加层的JavaScript中执行此操作对话。)
现在,我不是一个让像MVC这样的小限制而不是(直接)允许我重定向到一个新窗口阻止我,所以我尝试了给定的JavaScriptResult黑客,因为这已经是一个一次性的情况,对于我的问题来说,它似乎是最容易和最易维护的解决方案,尽管它是一个黑客攻击:
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应该自动打开的报告。
虽然我知道这种用法(在大多数情况下)被认为是反模式,但我无法修改用户界面以适应更可接受的用法。
问题:我错过了什么让这个黑客工作?
编辑:尝试了另一项无效的替代实施:
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中执行它们。话虽这么说,我仍然很好奇实际的方式让黑客工作,只是为了我自己的启发。
答案 0 :(得分:1)
尝试直接调用jquery .load函数。
return JavaScript("$('#targetdiv').load('controller/action?param="+someInfo+"');");