2009-05-16 7 views
33

मैं एक्शन फ़िल्टर OnActionExecuted में दृश्य में पारित मॉडल डेटा तक पहुंचने का प्रयास कर रहा हूं। यदि संभव है तो किस प्रकार, क्या कोई जानता है?Asp.net mvc - एक कस्टम एक्शन फ़िल्टर से मॉडल को एक्सेस करना

public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    //get model data 
    //... 

    sitemap.SetCurrentNode(model.Name); 
} 

किसी भी सलाह:

मैं इस तरह कुछ करने के लिए कोशिश कर रहा हूँ?

filterContext.Controller.ViewData.Model 

उत्तर

51

मॉडल पर है। मुझे उस संपत्ति को सेट करने के लिए OnModelUpdated ईवेंट का उपयोग करके समाधान मिला। उसके बाद

public class CustomModelBinder: DefaultModelBinder 
{ 
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     controllerContext.Controller.ViewData.Model = bindingContext.Model; 
     base.OnModelUpdated(controllerContext, bindingContext); 
    } 
} 

आप Global.asax में Application_Start() अनुभाग में अपने नए मॉडल बांधने की मशीन के लिए डिफ़ॉल्ट बांधने की मशीन स्थापित करने की आवश्यकता:

मैं मॉडल बांधने की मशीन है

ModelBinders.Binders.DefaultBinder = new CustomModelBinder(); 

अंत में आप तक पहुँच सकते हैं अपने Model एक ActionFilterAttribute में:

public class TraceLog : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     //filterContext.Controller.ViewData.Model now isn't null 
     base.OnActionExecuted(filterContext); 
    } 
} 
+8

यह हमेशा शून्य है :( – Korayem

+4

@ कोरायम - इस बात पर निर्भर करता है कि आप कितनी जल्दी कोशिश करते हैं और इसका उपयोग करते हैं। यदि आप नियंत्रक कार्रवाई निष्पादित करने के बाद इसे प्राप्त करते हैं तो यह व्यूमोडेल का एक उदाहरण होना चाहिए। – JBeckton

+8

यह सभी तरीकों से मेरे लिए शून्य है (ऑनएक्शन एक्सक्लूसिंग, ऑनएक्शन एक्स्क्टेड, ऑनरसल्ट एक्सक्लूसिंग, ऑनरसल्ट एक्स्क्टेड) ​​ –

18

मैं पता नहीं क्यों, लेकिन filterContext.Controller.ViewData.Model हमेशा अशक्त भी जब मॉडल बाँध OnActionExecuted से पहले मार डाला जाता है:

1

कार्रवाई:

[Breadcrumb("Index")] 
public ActionResult UnitIndex() 
{ 
    View(new Answers()); 
} 

विशेषता:

- आप अशक्त हो रही हैतो @Gustavo क्लीमेंट के जवाब देने के लिए विकल्प के रूप में आप OnActionExecuted अधिभावी और दृश्य में अपने ViewModel गुजर निम्नलिखित तरीके से कोशिश कर सकते हैं
public class BreadcrumbAttribute : ActionFilterAttribute 
{ 
    public string Page { get; set; } 

    public BreadcrumbAttribute(string page) 
    { 
     Page = page; 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var model = (IBreadcrumbs)filterContext.Controller.ViewData.Model; 
     model.Breadcrumbs = BreadcrumbHelper.GetBreadCrumbs(string.Format("{0}", filterContext.RouteData.DataTokens["area"]), Page); 
    } 
} 

enter image description here

+0

यह कोड कहां से है? आश्चर्यजनक रूप से मैं इस सवाल का जवाब विशेष रूप से हालिया परियोजना में ब्रेडक्रंब समाधान के तारों के तार के संदर्भ में ढूंढ रहा था! –

+0

@ क्रिसेंटफ्रेश मैंने इसे कंपनियों में से एक के लिए किया .... –

2

नेट कोर पर आप एक ActionArguments IDictionary संदर्भ पर,

तो आप निम्नलिखित नियंत्रक विधि

[HttpPost] 
    public void Post([FromBody]BaseRequest request) 
    { 
    } 

तुम इतनी

की तरह क्षेत्र का उपयोग कर सकते हैं, तो अपने विधि से सभी मापदंडों के साथ है
public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     var request = context.ActionArguments["request"] as BaseRequest;` 
     //do whatever, 
    } 
संबंधित मुद्दे