언제 속성을 사용 ChildActionOnly
하시겠습니까? 란 ChildAction
어떤 상황에서 당신이 속성을 사용하여 작업을 제한할까요?
답변
이 ChildActionOnly
속성은 조치 메소드가보기 내에서 하위 메소드로만 호출 될 수 있도록합니다. 액션 메서드는이 속성을 자식 액션으로 사용할 필요는 없지만,이 속성을 사용하여 사용자 요청의 결과로 액션 메서드가 호출되는 것을 방지합니다. 액션 메소드를 정의했으면 액션이 호출 될 때 렌더링되는 것을 만들어야합니다. 하위 조치는 필수는 아니지만 일반적으로 부분보기와 연관됩니다.
-
[ChildActionOnly] View에서 코드를 통한 액세스 제한
-
특정 페이지 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]
속성이 어떤 영향을 미치는지 잘 설명 합니다. 그러나 대부분의 예 @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