ASP.NET - ChildActionOnly和NonAction属性之间的区别是什么?

时间:2017-02-01 20:09:41

标签: c# asp.net asp.net-mvc

出于好奇,这两个属性之间的区别是什么?

NonAction和ChildActionOnly

这两个属性对我来说似乎都是一样的。阻止管道(动作调用者)调用动作方法。请看一下这个片段:

[NonAction]
private ActionResult StackOverflow1()
{
    // Omitted for brevity.
    return View();
}

[ChildActionOnly]
private ActionResult StackOverflow2()
{
    // Omitted for brevity.
    return View();
}

当然这两种方法都不会被调用,因为它们是私有的 - 至少在默认情况下是这样 - 但我想知道差异只是出于好奇......

2 个答案:

答案 0 :(得分:5)

ChildActionOnly - 只能通过其他操作调用,而不能直接通过外部调用(通过路由)调用。允许的操作包括Action / RenderAction扩展方法。

NonAction - 就像标记一个方法“私有”一样,以防止外部呼叫或子动作无法访问它。适合保护您不需要/想要作为直接视图创建的操作。值得一提的是,这只是公共方法所必需的(因为私人/受保护不被认为是“可操作的”)。

另见:

答案 1 :(得分:2)

操作方法是控制器中的公共方法,可以使用URL调用。因此,默认情况下,如果控制器中有任何公共方法,则可以使用URL请求调用它。 要限制对控制器中公共方法的访问,可以使用NonAction属性。

子动作方法与NonAction方法不同,因为无法使用 Action() RenderAction()帮助程序调用NonAction方法。

子操作方法不会响应URL请求。如果尝试,将抛出运行时错误 - 只有子请求才能访问子操作。

可以通过使用 Action() RenderAction() Html帮助程序从视图发出子请求来调用子操作方法。

操作方法不需要将[ChildActionOnly]属性用作子操作,但是如果要阻止因用户请求而调用操作方法,请使用此属性。< / p>

儿童行为通常与部分观点相关联,但这不是强制性的。

使用子操作方法,可以缓存视图的某些部分。这是儿童行动方法的主要优势。