سؤال

إذا كنت إنشاء كائن في تصفية إجراء مخصص في 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();
    }

نصائح أخرى

يوصف أفضل نهج فيل هاك.

وأساسا هذا هو ما تفعله:

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

وومسكتك الوحيد هو أنه إذا كنت تقوم بإنشاء المعلمات الكائن، ثم صفك (في هذه الحالة الشخص) يجب أن يكون منشئ افتراضي، وإلا فإنك سوف تحصل على استثناء.

وهنا هو كيف كنت استخدام فلتر أعلاه:

[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();
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top