4

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

另一种选择是在客户端进行。但再次不确定如何以通用方式正确执行此操作。

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 回答