2012-04-10 58 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调用的部分视图,任何四处走动?

相关问题