반응형
사용자 지정 작업 필터에서 작업으로 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();
}
반응형
'IT TIP' 카테고리의 다른 글
| Dagger2 종속성-Gradle (0) | 2020.11.19 |
|---|---|
| Pandas 데이터 프레임에서 튜플 열을 분할하는 방법은 무엇입니까? (0) | 2020.11.19 |
| Now ()에서 Postgresql의 Current_timestamp로 (0) | 2020.11.19 |
| 스칼라의 봉인 된 추상 대 추상 클래스 (0) | 2020.11.19 |
| Selenium에서 "StaleElementReferenceException"을 피하는 방법은 무엇입니까? (0) | 2020.11.19 |