본문 바로가기
ASP.NET MVC

ASP.NET MVC] ChildActionOnlyAttribute, ActionMethodSelectorAttribute

by Fastlane 2022. 7. 15.
728x90
반응형

ActionFilter

action의 실행을 intercept하여, action의 실행 전 또는 후에 실행을 주입할 수 있다. 

 

ActionFilter > ChildActionOnlyAttribute

ASP.NET MVC2에서 release된 action filter이다. 

IAuthorizationFilter interface를 구현하며, view file의 Html.Action() 또는 Html.RenderAction()에 의해서만 실행된다. 

 

Child actions은 주로 partial view와 관련되지만, 강제적이진 않다. Url request에 의해 action method가 실행되는 것을 방지하기 위한 attribute이다. 만일, Url request된다면 runtime error가 발생된다. 

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [ChildActionOnly]
        public ActionResult ChildAction()
        {
            return View();
        }
    }
@Html.Action("ChildAction")

NonAction methods와는 다르다, NonAction method는 Action(), RenderAction() helpers에 의해 실행되지 않는다. 

 

Action selectors

action selector는 action filter와 다르다. 둘다, attribute를 사용하므로 혼동되기 쉽다. 

action selector는 특정 action method 지정을 하기 위해 사용한다. 

Action selectors > ActionMethodSelectorAttribute

ActionMethodSelectorAttribute를 구현하는 built-in action selector가 있다. 

  • System.Web.Mvc.AcceptVerbsAttribute
  • System.Web.Mvc.HttpDeleteAttribute
  • System.Web.Mvc.HttpGetAttribute
  • System.Web.Mvc.HttpHeadAttribute
  • System.Web.Mvc.HttpOptionsAttribute
  • System.Web.Mvc.HttpPatchAttribute
  • System.Web.Mvc.HttpPostAttribute
  • System.Web.Mvc.HttpPutAttribute
  • System.Web.Mvc.NonActionAttribute

일반적으로, HTTP method에 의해 다르게 실행되는 overloaded action을 만들때 사용한다. 

 

아래 두 action method의 이름은 BannerEdit이다. 

URL은 동일하지만, HttpPostAttribute를 사용하여 POST request에만 실행되도록 지정할 수 있다.  

 

        // GET: Banner
        public ActionResult BannerEdit(int idx)
        {

            Banner banner = _bannerService.Get_Banner(idx);
            return View(banner);
        }

        [HttpPost]
        public ActionResult BannerEdit(Banner banner)
        {
            string errMsg = string.Empty;

            try
            {
                _bannerService.Update_Banner(originbanner);
            }
            catch (Exception ex)
            {
                ViewBag errMsg = ex.Message.ToString();
            }

            return Redirect("/Banner/BannerList");
        }

 

 

728x90
반응형

댓글