2016-08-11 13 views
7

मेरे पास एक सामान्य क्रिया फ़िल्टर है, और मैं OnActionExecuting विधि में वर्तमान मॉडल प्राप्त करना चाहता हूं। मेरा वर्तमान कार्यान्वयन नीचे जैसा है:एक्शन फ़िल्टर में मौजूदा मॉडल कैसे प्राप्त करें

public class CommandFilter<T> : IActionFilter where T : class, new() 
{ 
     public void OnActionExecuting(ActionExecutingContext actionContext) 
     { 
      var model= (T)actionContext.ActionArguments["model"]; 
     } 
} 

यह मेरे सभी मॉडल नाम समान हैं, तो यह अच्छी तरह से काम करता है। लेकिन मैं differnet मॉडल नामों का उपयोग करना चाहता हूँ।

इस समस्या को हल करने के लिए कैसे करें?

संपादित

public class HomeController : Controller 
{ 
    [ServiceFilter(typeof(CommandActionFilter<CreateInput>))] 
    public IActionResult Create([FromBody]CreateInput model) 
    { 
     return new OkResult(); 
    } 
} 
+0

की तरह कुछ http://stackoverflow.com/questions/872796/asp-net-mvc-accessing-view-model-from-a-custom लिख सकते हैं -action-filter – user2184057

+0

@ user2184057 यह मॉडल देखने के लिए है, मॉडल – Set

उत्तर

4

ActionExecutingContext.ActionArguments बस है एक शब्दकोश,

/// <summary> 
    /// Gets the arguments to pass when invoking the action. Keys are parameter names. 
    /// </summary> 
    public virtual IDictionary<string, object> ActionArguments { get; } 

और आप पाश हालांकि यह करने की जरूरत है अगर आप हार्डकोडेड पैरामीटर नाम ("मॉडल") से बचने के लिए की जरूरत है। asp.net के लिए the same SO answer से:

जब हम एक सामान्य कार्रवाई फिल्टर कुछ विशिष्ट आवश्यकताओं के लिए इसी तरह की वस्तुओं का एक वर्ग पर काम करने की जरूरत है कि बनाने के लिए, हम अपने मॉडल को लागू एक अंतरफलक => पता है जो तर्क है हो सकता था मॉडल जिस पर हमें काम करने की ज़रूरत है और हम इंटरफेस के बावजूद विधियों को कॉल कर सकते हैं।

आप इस स्थिति में आप

public void OnActionExecuting(ActionExecutingContext actionContext) 
{ 
    foreach(var argument in actionContext.ActionArguments.Values.Where(v => v is T))) 
    { 
     T model = argument as T; 
     // your logic 
    } 
} 
+0

"टी है" फिर "टी के रूप में" उस कोड को बेहतर बनाने के लिए कुछ तरीका पोस्ट किया है? आप मेरे दृष्टिकोण से दो बार कास्टिंग कर रहे हैं .... –

4

आप base MVC Controller को ActionExecutingContext.Controller संपत्ति

/// <summary> 
    /// Gets the controller instance containing the action. 
    /// </summary> 
    public virtual object Controller { get; } 

और परिवर्तित परिणाम उपयोग कर सकते हैं मॉडल के लिए पहुँच जाते हैं:

((Controller)actionExecutingContext.Controller).ViewData.Model 
+0

का अनुरोध नहीं करता है, यह एक कास्ट अपवाद फेंकता है: 'माइक्रोसॉफ्ट स्पेस। होम कंट्रोलर' टाइप करने में असमर्थ 'माइक्रोसॉफ्ट.एस्पनेट कॉर.एमवीसी कंट्रोलर' टाइप करने में असमर्थ। –

+0

क्या आप होमकंट्रोलर की परिभाषा दिखा सकते हैं? – Set

+0

ओओ क्षमा करें, मैं 'नियंत्रक 'आधार परिभाषा भूल गया हूँ। मैंने कोड संपादित किया लेकिन अब मॉडल शून्य है (शायद मुझे कुछ याद आती है)। मेरा अपडेट देखें –

संबंधित मुद्दे