[C#] MVC에서 ChildActionOnly 사용

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



답변

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

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

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


답변

[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()


답변

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

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


답변

참고로, [ChildActionOnly]는 ASP.NET MVC Core에서 사용할 수 없습니다. 여기에 몇 가지 정보를 참조 하십시오


답변

파티에 조금 늦었지만 …

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

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

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


답변

    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 


답변