IT TIP

사용자 지정 작업 필터에서 작업으로 ASP.NET MVC 전달 개체

itqueen 2020. 11. 19. 22:44
반응형

사용자 지정 작업 필터에서 작업으로 ASP.NET MVC 전달 개체


ASP.NET MVC의 사용자 지정 작업 필터에 개체를 만들면

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    DetachedCriteria criteria = DetachedCriteria.For<Person>();
    criteria.Add("stuff");

    // Now I need to access 'criteria' from the Action.....

}

현재 실행중인 액션에서 객체에 액세스 할 수있는 방법이 있습니까?


Route 데이터에 넣는 것이 좋습니다.

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.RouteData.Values.Add("test", "TESTING");
        base.OnActionExecuting(filterContext);
    }

    public ActionResult Index()
    {
        ViewData["Message"] = RouteData.Values["test"];

        return View();
    }

나은 접근 방식 은 Phil Haack이 설명합니다.

기본적으로 이것은 당신이하는 일입니다 :

public class AddActionParameterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        // Create integer parameter.
        filterContext.ActionParameters["number"] = 123;

        // Create object parameter.
        filterContext.ActionParameters["person"] = new Person("John", "Smith");
    }
}

유일한 문제는 객체 매개 변수를 생성하는 경우 클래스 (이 경우 Person)에 기본 생성자가 있어야하며 그렇지 않으면 예외가 발생한다는 것입니다.

위의 필터를 사용하는 방법은 다음과 같습니다.

[AddActionParameter]
public ActionResult Index(int number, Person person)
{
    // Now you can use number and person variables.
    return View();
}

다음을 사용할 수 있습니다 HttpContext.

filterContext.HttpContext.Items["criteria"] = criteria;

그리고 액션에서 읽을 수 있습니다.

[YourActionFilter]
public ActionResult SomeAction() 
{
    var criteria = HttpContext.Items["criteria"] as DetachedCriteria;
}

조치에 매개 변수로 전달하는 경우 ViewData 또는 viewmodel의 항목을 설정하십시오. 여기에서 ViewModel의 속성을 설정합니다.

public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
     ViewModelBase viewModel = null;
     foreach (object parameter in filterContext.ActionParameters.Values)
     {
         if (parameter is ViewModelBase)
         {
             viewModel = (ViewModelBase)parameter;
             break;
         }
     }
     if(viewModel !=null)
     {
         viewModel.SomeProperty = "SomeValue";
     }
 }


    public ActionResult About(ViewModelBase model)
    {
      string someProperty= model.SomeProperty;
}

내가 선호한다고 생각하는 형식화되지 않은 버전은 다음과 같습니다.

   public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Controller.ViewData.Add("TestValue", "test");

    }

       [FilterWhichSetsValue]
        public ActionResult About()
        {
            string test = (string)ViewData["TestValue"];
            return View();
        }

참고URL : https://stackoverflow.com/questions/1809042/asp-net-mvc-pass-object-from-custom-action-filter-to-action

반응형