在ASP.NET MVC 3中,filterContext.IsChildAction是什么?

Cha*_*eus 22 c# asp.net-mvc

从它的声音来看,它实际上是一个布尔值,表示该动作是否是一个子动作.

我经常看到这段代码:

protected override void OnActionExecuting(ActionExecutingContext filterContext) {
    if (filterContext.IsChildAction) return;
    ...
}
Run Code Online (Sandbox Code Playgroud)

它似乎是"扼杀"不必要的代码执行......但filterContext.IsChildAction实际上是什么意思?

arc*_*hil 35

在视图页面中,您可能经常需要将另一个操作的输出注入当前页面 - 例如,注入菜单.菜单生成可能涉及许多业务逻辑(确定权限或用户,选择所选项目等),因此不是在局部视图中完成,而是在控制器中完成.

public class MenuController : Controller
{
   [ChildActionOnly]
   public ActionResult Menu()
   {
      MenuViewModel model = GenerateMenu();
      return View(model);
   }
}
Run Code Online (Sandbox Code Playgroud)

这种类型的动作称为ChildAction,因为它不能(并且不应该)从外部世界调用(通过访问url).这可能只能由应用程序本身调用,通常来自视图页面.

@Html.Action("Menu", "Menu")
Run Code Online (Sandbox Code Playgroud)

如果您希望(或不希望)在执行的操作是子操作时执行某些特定操作,则检查filterContext.IsChildAction属性.

  • 优秀的写作,谢谢.我不知道ChildActionOnly属性存在.嗯......我将不得不利用这一点,谢谢! (3认同)
  • 这是一个很好的答案.我只想补充一点,IsChildAction属性不必在标有"ChildActionOnly"属性的操作上发生.它发生在任何时候调用@ Html.Action方法,它在概念上类似于Request.IsAjaxRequest (3认同)