在每个控制器动作上注入javascript - asp.net mvc

时间:2012-04-10 20:23:09

标签: asp.net-mvc controller action viewmodel

每当我们调用任何动作控制器时,无论是通过完整的回发还是ajax调用,我都要检查视图模型,并根据某些逻辑注入一些要在浏览器中执行的javascript。该应用程序大部分已经编码,我想要做的是有一些通用的代码可以做到这一点。我想知道最好的方法是什么。 我正在考虑使用动作过滤器,然后检查模型,然后根据需要注入js。但不确定如何处理诸如动作执行等事件。任何代码示例都会有所帮助。

另一种选择是在客户端进行。但又不确定如何以通用的方式正确地做到这一点。

3 个答案:

答案 0 :(得分:4)

查看覆盖基本控制器的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!');";
        }
    }
}

答案 1 :(得分:1)

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

可能不是最干净的解决方案,但有效。

答案 2 :(得分:0)

filterContext.HttpContext.Response.Write(sb.ToString()); 这将覆盖来自Ajax调用的局部视图,任何走动?