4

フル ポスト バックまたは ajax 呼び出しを介してアクション コントローラーを呼び出すたびに、ビュー モデルをチェックし、いくつかのロジックに応じて、ブラウザーで実行される JavaScript を挿入します。アプリケーションはほとんど既にコード化されており、私がやろうとしているのは、トリックを実行できる汎用コードを用意することです。私はそれを行うための最良の方法は何だろうと思っています。アクション フィルターを使用してモデルをチェックし、必要に応じて js を挿入することを考えています。しかし、実行されたアクションなどのイベントでどのように機能するかはわかりません。コードサンプルは役に立ちます。

もう 1 つのオプションは、クライアント側で行うことです。しかし、一般的な方法で適切に行う方法がわかりません。

4

3 に答える 3

7

アクションによって処理された後にビュー モデルへのアクセスを提供する必要がある、ベース コントローラーの OnActionExecuted イベントをオーバーライドすることを検討してください。私は興味がありますが、JavaScript のスニペットを AJAX 応答 (通常は単純な JSON オブジェクト) にどのように正確に挿入するのでしょうか?

コントローラーから JavaScript を挿入する方法だけを本当に求めている場合は、次のようにビューに配置できます。

<script type="text/javascript" defer="defer">
    @Html.Raw(ViewBag.StartupScript)
</script>

上記を特定のビューまたはレイアウト ページに追加できます。次に、次のようなことができます。

public class MyController : Controller
{
    public override void OnActionExecuted(...)
    {
        if (...)
        {
            ViewBag.StartupScript = "alert('hello world!');";
        }
    }
}
于 2012-04-10T20:35:43.227 に答える
2

ここでポストバックと ajax 呼び出しに注入するには、次のようにします。

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
            StringBuilder sb = new StringBuilder();
            sb.Append("<script type=\"text/javascript\">\n\t");
            sb.Append("alert('Hello Injection');");
            sb.Append("</script>\n");
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.HttpContext.Response.Write(sb.ToString());
            }
            else
            {
                ViewBag.StartupScript = sb.ToString();
            }
}

おそらく最もクリーンなソリューションではありませんが、機能します。

于 2012-04-11T19:01:11.710 に答える
0

filterContext.HttpContext.Response.Write(sb.ToString()); これは、Ajax 呼び出しからの部分ビューをオーバーライドします。

于 2016-01-22T17:18:40.113 に答える