在MVC中使用ChildActionOnly

Raf*_*rik 164 c# asp.net-mvc

你什么时候使用这个属性ChildActionOnly?什么是ChildAction在什么情况下你想要使用这个属性来限制一个动作?

Tom*_*uλa 160

ChildActionOnly属性确保只能从视图中调用操作方法作为子方法.action方法不需要将此属性用作子操作,但我们倾向于使用此属性来防止因用户请求而调用操作方法.定义了一个动作方法后,我们需要创建在调用动作时将呈现的内容.儿童行为通常与部分观点相关联,但这不是强制性的.

  1. [ChildActionOnly]允许通过View中的代码进行受限访问

  2. 特定页面URL的状态信息实现.示例:付款页面URL(仅支付一次)剃刀语法允许以条件方式调用特定操作

  • 示例代码:@ Clark-Kent` //音乐商店的示例// GET:/ ShoppingCart/CartSummary [ChildActionOnly] public ActionResult CartSummary(){// your stuff}/ShoppingCart/CartSummary将返回"动作'CartSummary'可访问只有一个子请求."`所以你直接阻止GET到某个控制器,但只能在另一个控制器/动作中.可能:_Partial观点. (12认同)
  • 答案很好.如果你添加一些代码可能会更好. (2认同)

yan*_*taq 122

在 注释了[ChildActionOnly]属性的情况下,可以仅从视图中调用操作方法作为子方法.这是[ChildActionOnly]的示例..

有两种操作方法:Index()和MyDateTime()以及相应的Views:Index.cshtml和MyDateTime.cshtml.这是HomeController.cs

public class HomeController : Controller
 {
    public ActionResult Index()
    {
        ViewBag.Message = "This is from Index()";
        var model = DateTime.Now;
        return View(model);
    }

    [ChildActionOnly]
    public PartialViewResult MyDateTime()
    {
        ViewBag.Message = "This is from MyDateTime()";

        var model = DateTime.Now;
        return PartialView(model);
    } 
}
Run Code Online (Sandbox Code Playgroud)

这是Index.cshtml的视图.

@model DateTime
@{
    ViewBag.Title = "Index";
}
<h2>
    Index</h2>
<div>
    This is the index view for Home : @Model.ToLongTimeString()
</div>
<div>
    @Html.Action("MyDateTime")  // Calling the partial view: MyDateTime().
</div>

<div>
    @ViewBag.Message
</div>
Run Code Online (Sandbox Code Playgroud)

这是MyDateTime.cshtml局部视图.

@model DateTime

<p>
This is the child action result: @Model.ToLongTimeString()
<br />
@ViewBag.Message
</p>
Run Code Online (Sandbox Code Playgroud)
 if you run the application and do this request http://localhost:57803/home/mydatetime
 The result will be Server Error like so: 

在此输入图像描述

这意味着您无法直接调用局部视图.但它可以通过Index()视图在Index.cshtml中调用

     @Html.Action("MyDateTime")  // Calling the partial view: MyDateTime().
 

If you remove [ChildActionOnly] and do the same request http://localhost:57803/home/mydatetime it allows you to get the mydatetime partial view result:
This is the child action result. 12:53:31 PM 
This is from MyDateTime()
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,比接受的答案更好的解释 (12认同)
  • 描述性很强 (2认同)

Eri*_*lje 74

如果您RenderAction在任何视图中使用它,通常用于渲染局部视图,您将使用它.

标记它的原因[ChildActionOnly]是您需要将控制器方法公开,以便您可以调用它,RenderAction但您不希望某人能够导航到URL(例如/ Controller/SomeChildAction)并查看其结果行动直接.

  • @DarthVader - 类似,但是使用[NonAction]你将无法使用`RenderAction`来调用它 (10认同)
  • 类似于[NonAction].是吗?那有什么不同呢? (2认同)

小智 9

仅供参考,[ChildActionOnly]在ASP.NET MVC Core中不可用.在这里看到一些信息


nei*_*zan 6

派对有点晚了,但......

其他答案很好地解释了[ChildActionOnly]属性的影响.但是,在大多数示例中,我一直在问自己,为什么我只是为了在视图中直接渲染时在另一个视图中渲染局部视图而创建一个新的动作方法@Html.Partial("_MyParialView").这似乎是一个不必要的层.但是,正如我调查的那样,我发现一个好处是子动作可以创建一个不同的模型并将其传递给局部视图.部分所需的模型可能在呈现局部视图的视图的模型中不可用.不是修改模型结构以获得必要的对象/属性而只是为了呈现局部视图,您可以调用子操作并让action方法负责创建局部视图所需的模型.

例如,这可以派上用场_Layout.cshtml.如果您拥有所有页面共有的一些属性,则实现此目的的一种方法是使用基本视图模型并使所有其他视图模型从中继承.然后,_Layout可以使用基本视图模型和公共属性.缺点(主观)是所有视图模型都必须从基本视图模型继承,以保证这些公共属性始终可用.另一种方法是@Html.Action在那些常见的地方渲染.动作方法将为所有页面共有的局部视图创建一个单独的模型,这不会影响"主"视图的模型.在此替代方案中,_Layout页面不需要具有模型.因此,所有其他视图模型不需要从任何基本视图模型继承.

我确定使用该[ChildActionOnly]属性还有其他原因,但对我来说这似乎是一个很好的理由,所以我想我会分享.