2012-04-10 16 views
2

フルポストバックかajaxコールのいずれかでアクションコントローラを呼び出すたびに、ビューモデルをチェックし、ロジックによっては、ブラウザで実行されます。アプリケーションはほとんどがすでにコード化されていますし、私がやっていることはそのトリックを行うことができるいくつかの一般的なコードを持つことです。私はそれをする最善の方法が何だろうと思っています。 アクションフィルタを使用してモデルをチェックし、必要に応じてjsを注入することを考えています。しかし、アクションの実行などのイベントでどのように動作するのかはっきりしていません。コードサンプルが参考になります。すべてのコントローラアクションにjavascriptを注入する - asp.net mvc

もう1つの選択肢は、クライアント側で行うことです。しかし、再び一般的な方法でそれを正しく行う方法がわかりません。

+1

JavaScriptは各ページで同じですか? –

+1

jsコードをMasterPageに追加できますか? – Vitall

答えて

2

ベースコントローラのOnActionExecutedイベントをオーバーライドします。このイベントによって、アクションによって処理された後にビューモデルにアクセスできるようになります。私は不思議ですが、AJAXレスポンスにどのように正確にjavascriptのスニペットを挿入するのですか?これは通常JSONオブジェクトです。

あなたが本当に求めているすべてのコントローラからJavaScriptを注入する方法であれば、あなたはあなたのビューに次のように置くことができます:

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

あなたが特定のビュー、またはレイアウトページに上記を追加することができます。ポストバックに注入だけでなく、Ajaxはあなたがそれを行うことができる方法で、ここでのコールに

public class MyController : Controller 
{ 
    public override void OnActionExecuted(...) 
    { 
     if (...) 
     { 
      ViewBag.StartupScript = "alert('hello world!');"; 
     } 
    } 
} 
+0

はい私が知っている部分。私の質問はまさにあなたが求めているものです。このイベントでクライアント側で実行されるjavascriptをどのように注入できますか? asp.netのWebフォームには登録スクリプトがありますが、mvcにそれを行う方法がない場合はありません。 – user784796

+0

私は自分の投稿に例を追加しました。 – Chris

+0

それは動作します。 Chrisに感謝します。ほんの少しの修正。 コントローラコードにセミコロンがありません。 ViewBag.StartupScript = "アラート( 'hello world!');"; そして、ビュー内では @ Html.Raw(@ ViewBag.StartupScript)でなければなりません。そうしないと、スクリプトは実行されません。 – user784796

0

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(); 
      } 
} 

おそらくないきれいな解決策はなく、作品次に、あなたはこのような何かを行うことができます。

0

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

関連する問題