69

ASP.NETMVCのカスタムアクションフィルターでオブジェクトを作成した場合

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

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

}

現在実行中のアクションからオブジェクトにアクセスする方法はありますか?

4

4 に答える 4

65

より良いアプローチは、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();
}
于 2012-11-28T18:23:57.113 に答える
56

ルートデータに入れることをお勧めします。

    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();
    }
于 2009-11-27T16:07:20.297 に答える
42

あなたは使用することができますHttpContext

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

そして、あなたはアクションでそれを読むことができます:

[YourActionFilter]
public ActionResult SomeAction() 
{
    var criteria = HttpContext.Items["criteria"] as DetachedCriteria;
}
于 2009-11-27T14:38:09.917 に答える
3

アクションにパラメーターとして渡す場合は、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;
}

あなたが好むと思う型なしのバージョンは次のとおりです。

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

    }

       [FilterWhichSetsValue]
        public ActionResult About()
        {
            string test = (string)ViewData["TestValue"];
            return View();
        }
于 2009-11-27T15:46:44.923 に答える