Frage

Wenn ich erstelle ein Objekt in einem Filter Benutzerdefinierte Aktion in ASP.NET MVC in

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

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

}

ist es eine Möglichkeit, das Objekt von der Aktion zugreifen kann, die gerade ausgeführt wird.

War es hilfreich?

Lösung

Ich würde empfehlen, es in den Routendaten setzen.

    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();
    }

Andere Tipps

Die besserer Ansatz von Phil Haack beschrieben wird.

Im Grunde ist dies, was Sie tun:

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");
    }
}

Der einzige gotcha ist, dass, wenn Sie Objektparameter erstellen, dann die Klasse (in diesem Fall Person) einen Standardkonstruktor haben muss, sonst werden Sie eine Ausnahme erhalten.

Hier ist, wie Sie den oben genannten Filter verwenden würden:

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

Sie könnten die HttpContext verwenden:

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

Und Sie können es in der Aktion lesen:

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

Stellen Artikel in Bildschirmtextsystem oder eine Ansichtsmodell, wenn Sie es als Parameter in der Aktion übergeben. Hier stelle ich die Eigenschaft einer Ansichtsmodell

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;
}

Hier ist die nicht typisierte Version Ich glaube, Sie bevorzugen:

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

    }

       [FilterWhichSetsValue]
        public ActionResult About()
        {
            string test = (string)ViewData["TestValue"];
            return View();
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top