MVC에서 ChildActionOnly 사용


168

언제 속성을 사용 ChildActionOnly하시겠습니까? 란 ChildAction어떤 상황에서 당신이 속성을 사용하여 작업을 제한할까요?

답변:


161

ChildActionOnly속성은 조치 메소드가보기 내에서 하위 메소드로만 호출 될 수 있도록합니다. 액션 메서드는이 속성을 자식 액션으로 사용할 필요는 없지만,이 속성을 사용하여 사용자 요청의 결과로 액션 메서드가 호출되는 것을 방지합니다. 액션 메소드를 정의했으면 액션이 호출 될 때 렌더링되는 것을 만들어야합니다. 하위 조치는 필수는 아니지만 일반적으로 부분보기와 연관됩니다.

  1. [ChildActionOnly] View에서 코드를 통한 액세스 제한

  2. 특정 페이지 URL에 대한 상태 정보 구현 예 : 지불 페이지 URL (한 번만 지불) 면도기 구문을 사용하면 조건부로 특정 작업을 호출 할 수 있습니다


뷰에서의 사용 예 : <% Html.RenderAction ( "MyChildAction", "MyController"); %>. 따라서 당신은 GET과 라우팅으로 아동 행동을 부를 수 없습니다
Erik Bergstedt

12
예제 코드 : @ Clark-Kent // example from Music Store // GET: /ShoppingCart/CartSummary [ChildActionOnly] public ActionResult CartSummary() { // your stuff } /ShoppingCart/CartSummary will return "The action 'CartSummary' is accessible only by a child request." 따라서 특정 컨트롤러에 대한 GET을 다른 컨트롤러 / 액션 내에서만 GET하지 못하게합니다. _ 부분보기.
Langeleppel

1
브라우저를 통해 InvalidOperationException표시된 메소드 <ChildActionOnly>가 호출 될 때 가장 잘 포착 하는 방법 은 무엇입니까?
Bernhard Döbler

@ Html.Action :)
chris c

125

[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);
    } 
}

다음은 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>

다음은 MyDateTime.cshtml 부분보기입니다.

@model DateTime

<p>
This is the child action result: @Model.ToLongTimeString()
<br />
@ViewBag.Message
</p>
 애플리케이션을 실행하고이 요청을 수행하는 경우 http : // localhost : 57803 / home / mydatetime
 결과는 다음 과 같이 서버 오류 가됩니다 .

여기에 이미지 설명을 입력하십시오

즉, 부분보기를 직접 호출 할 수 없습니다. 그러나 Index.cshtml에서와 같이 Index () 뷰를 통해 호출 할 수 있습니다

     @ Html.Action ( "MyDateTime") // 부분보기 호출 : MyDateTime ().
 

[ChildActionOnly] 를 제거 하고 동일한 요청 http : // localhost : 57803 / home / mydatetime을 수행하면 mydatetime 부분보기 결과를 얻을 수 있습니다.
This is the child action result. 12:53:31 PM 
This is from MyDateTime()

나는이 설명이 "완전한 중지"라고 생각합니다. 감사합니다 남자
TAHA SULTAN

그러나 그것은 NonAction또한 어떤 차이를 만들어서 달성 할 수 있습니까?
Imad

74

RenderAction뷰에서 사용하는 경우 일반적으로 부분 뷰를 렌더링하는 데 사용합니다.

그것을 표시하는 이유 [ChildActionOnly]는 컨트롤러 메소드를 공개해야 호출 할 수 있기 때문에 RenderAction누군가가 URL을 탐색 할 수 없도록하고 (예 : / Controller / SomeChildAction) 그 결과를 볼 수 있기 때문입니다. 직접 행동.


2
[NonAction]과 유사합니다. 그렇습니까? 차이점은 무엇입니까?
DarthVader

10
@DarthVader - 유사하지만, [NonAction] 당신은 사용하여 전화를 할 수 없을 것 RenderAction중 하나
에릭 Petroelje

@EricPetroelje : NonActionAttribute실제 프로젝트에서 와 같이 행동 방법을 표시하면 어떤 이점이 있습니까?
wuhcwdc 2016 년

1
@Pankaj-솔직히, 나는 정말로 좋은 이유를 생각할 수 없습니다. 당신이 컨트롤러의 방법은 URL을 통해 액세스 할 수 있도록하지 않으려면 가장 좋은 방법은 방법 있도록하는 것 private또는 protected. public직접 또는 전화를 통해 컨트롤러 메소드를 만들고 싶을만한 이유를 잘 모르겠습니다.RenderAction
Eric Petroelje

@Eric : 때로는 계산하기 위해 작은 코드를 작성해야하므로 컨트롤러에 공개 된 경우 URL로 액세스 할 수 있습니다. URL로 액세스하지 않으려면 [NonAction으로 표시하십시오. ]
Ali Adravi


8

파티에 조금 늦었지만 ...

다른 답변은 [ChildActionOnly]속성이 어떤 영향을 미치는지 잘 설명 합니다. 그러나 대부분의 예 @Html.Partial("_MyParialView")에서, 뷰에서 직접 렌더링 할 수있을 때 다른 뷰 내에서 부분 뷰를 렌더링하기 위해 새로운 액션 메소드를 작성하는 이유를 스스로 묻습니다 . 불필요한 층처럼 보였습니다. 그러나 조사한 결과 한 가지 이점은 하위 작업이 다른 모델을 만들어 부분 뷰에 전달할 수 있다는 것입니다. 부분 뷰에 필요한 모델은 부분 뷰가 렌더링되는 뷰 모델에서 사용하지 못할 수 있습니다. 부분 뷰를 렌더링하기 위해 필요한 객체 / 속성을 얻기 위해 모델 구조를 수정하는 대신 하위 조치를 호출하고 조치 메소드가 부분 뷰에 필요한 모델 작성을 처리하도록 할 수 있습니다.

예를 들어에서 편리합니다 _Layout.cshtml. 모든 페이지에 공통된 몇 가지 속성이있는 경우이를 수행하는 한 가지 방법은 기본보기 모델을 사용하고 다른 모든보기 모델에서 상속하는 것입니다. 그런 다음 _Layout기본보기 모델과 공통 속성을 사용할 수 있습니다. 단점 (주관적)은 모든 뷰 모델이 기본 뷰 모델에서 상속하여 이러한 공통 속성을 항상 사용할 수 있다는 점입니다. 대안은 @Html.Action그 일반적인 장소에서 렌더링 하는 것입니다. 조치 방법은 모든 페이지에 공통 인 부분보기에 필요한 별도의 모델을 작성하며 "기본"보기의 모델에는 영향을 미치지 않습니다. 이 대안에서 _Layout페이지에는 모델이 필요하지 않습니다. 다른 모든 뷰 모델은 기본 뷰 모델에서 상속 할 필요가 없습니다.

나는 그 [ChildActionOnly]속성 을 사용해야 할 다른 이유가 있다고 확신 하지만, 이것은 나에게 좋은 것 같아서 공유 할 것이라고 생각했다.


1
또 다른 장점은 부분 호출이 작업 호출에 래핑되면 캐시 속성을 추가 할 수 있다는 것입니다.
kamgman

0
    public class HomeController : Controller  
    {  
        public ActionResult Index()  
        {  
            ViewBag.TempValue = "Index Action called at HomeController";  
            return View();  
        }  

        [ChildActionOnly]  
        public ActionResult ChildAction(string param)  
        {  
            ViewBag.Message = "Child Action called. " + param;  
            return View();  
        }  
    }  


The code is initially invoking an Index action that in turn returns two Index views and at the View level it calls the ChildAction named ChildAction”.

    @{
        ViewBag.Title = "Index";    
    }    
    <h2>    
        Index    
    </h2>  

    <!DOCTYPE html>    
    <html>    
    <head>    
        <title>Error</title>    
    </head>    
    <body>    
        <ul>  
            <li>    
                @ViewBag.TempValue    
            </li>    
            <li>@ViewBag.OnExceptionError</li>    
            @*<li>@{Html.RenderAction("ChildAction", new { param = "first" });}</li>@**@    
            @Html.Action("ChildAction", "Home", new { param = "first" })    
        </ul>    
    </body>    
    </html>  


      Copy and paste the code to see the result .thanks 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.