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