2012-04-10 63 views
2

每當我們調用任何操作控制器是否通過完整的回發或ajax調用我想檢查視圖模型,並根據一些邏輯注入一些JavaScript是在瀏覽器中執行。該應用程序大部分已經編碼,我試圖做的是有一些通用的代碼可以做到這一點。我想知道做什麼是最好的方法。 我在考慮使用動作過濾器,然後檢查模型,然後在需要時注入js。但不知道該如何工作,如行動執行等事件。任何代碼示例將有所幫助。每個控制器動作注入JavaScript - asp.net mvc

另一種選擇是在客戶端進行。但也不知道如何以通用的方式正確地做到這一點。

+1

每個頁面的javascript是否相同? – 2012-04-10 20:41:58

+1

您能否將js代碼添加到MasterPage? – Vitall 2012-04-17 05:52:11

回答

2

重新考慮覆蓋基本控制器的OnActionExecuted事件,該事件應該允許您在視圖模型被操作處理後訪問視圖模型。然而,我很好奇,你到底怎樣才能在AJAX響應中注入一段JavaScript代碼,這通常是一個簡單的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!');"; 
     } 
    } 
} 
+0

是我知道的部分。我的問題正是你所問的。在這個事件中,如何注入JavaScript在客戶端執行?在asp.net web表單中有註冊腳本,但是如果在mvc中沒有辦法做到這一點的話。 – user784796 2012-04-10 21:05:18

+0

我在帖子中添加了一個示例。 – Chris 2012-04-10 21:41:34

+0

工作。謝謝克里斯。幾乎沒有更正。 您的控制器代碼中缺少分號。 ViewBag.StartupScript =「alert('hello world!');」; 而在視圖中應該是 @ Html.Raw(@ ViewBag.StartupScript),否則你的腳本將無法運行。 – user784796 2012-04-11 14:46:29

0

要注入的回傳以及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(); 
      } 
} 

也許不是最乾淨的解決辦法,但工程。

0

filterContext.HttpContext.Response.Write(sb.ToString()); 這將覆蓋來自Ajax調用的部分視圖,任何四處走動?

相關問題