ASP.NET MVC Custom Action Filter에서 동작으로 객체를 통과합니다.
-
05-07-2019 - |
문제
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.....
}
현재 실행중인 조치에서 객체에 액세스 할 수있는 방법이 있습니까?
해결책
경로 데이터에 넣는 것이 좋습니다.
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");
}
}
유일한 gotcha는 객체 매개 변수를 작성하는 경우 클래스 (이 경우 사람)에 기본 생성자가 있어야한다는 것입니다. 그렇지 않으면 예외가 발생합니다.
위의 필터를 사용하는 방법은 다음과 같습니다.
[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에서 항목을 동작에 매개 변수로 전달하면 항목을 설정하십시오. 여기서 나는 뷰 모델의 속성을 설정했습니다
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;
}
다음은 내가 선호한다고 생각하는 Untyped 버전입니다.
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.Controller.ViewData.Add("TestValue", "test");
}
[FilterWhichSetsValue]
public ActionResult About()
{
string test = (string)ViewData["TestValue"];
return View();
}
제휴하지 않습니다 StackOverflow