2

質問:このハックを機能させるために何が欠けていますか?

私が取り組んでいるMVCアプリの場合、「異常な」ケースに遭遇しました。

ActiveReportsを使用して特定のレポートを生成し、許可されているユーザーには、新しいウィンドウで開くこれらのレポートへのアクセスを許可するActionLinkをレイアウトに表示します。このプロジェクトの方向性は、すべてのレポートが新しいウィンドウで開くことです。

ただし、ドロップダウンとテキストフィールドで構成されるオーバーレイを使用してこのレポートにアクセスするため、ActionLinkの簡単な修正を適用できない外れ値が1つあります。これらの組み合わせはコントローラーに送られ、コントローラーは指定された条件に基づいてアクションへのリダイレクトを返します(サーバーでのみ発生する必要がある特定のチェックがあるため、このオーバーレイのJavaScriptでこれを行わないのはなぜですかダイアログ。)

さて、私はMVCのような小さな制限を(直接)新しいウィンドウにリダイレクトすることを許可しないようにする人ではないので、これはすでに1回限りの状況であるため、指定された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のその部分が自動的に開くことになっているというレポートではありません。

この使用法は(ほとんどの場合)アンチパターンと見なされることを理解していますが、より受け入れられる使用法に対応するために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で実行するという新しい方向性が生まれました。そうは言っても、私自身の啓蒙のために、ハックを機能させる実際の方法にはまだ興味があります。

4

1 に答える 1

1

代わりに、jquery.load関数を直接呼び出してみてください。

return JavaScript("$('#targetdiv').load('controller/action?param="+someInfo+"');");
于 2013-05-08T18:34:53.363 に答える