2012-02-09 15 views
9

के लिए हो रही से पहले मॉडल करने के लिए मैं निम्नलिखित है जोड़ें:OnActionExecuting कार्रवाई

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     if (filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 

     var model = filterContext.Controller.ViewData.Model as BaseViewModel; 

     if (model == null) 
     { 
      model = new BaseViewModel(); 
      filterContext.Controller.ViewData.Model = model; 
     } 

     model.User = (UserPrincipal)filterContext.HttpContext.User; 
     model.Scheme = GetScheme(); 
    } 

अब जब कि के माध्यम से कदम मैं देख सकता हूँ उपयोगकर्ता और मॉडल पर योजना आबादी जा रहा है।

जब तक मैं कार्रवाई में आता हूं, हालांकि वे दोनों शून्य हैं?

मैं यहाँ क्या गलत कर रहा हूं?

और इसमें जोड़ना, क्या यह मॉडल में जोड़ने का उचित तरीका है?

[InjectStandardReportInputModel] 
public ActionResult Header(BaseViewModel model) 
{ 
    //by this point model.Scheme is null!! 

} 
+0

आप भी अपने 'Controller' कोड पोस्ट कर सके तरह तो क्या होगा? आप सुनिश्चित हैं कि आपने 'वर्ग' परिभाषा या लागू 'क्रिया'/एस में 'विशेषता' जोड़ा है? – xandercoded

+0

जोड़ा गया एक्शन कोड - क्या आप कह रहे हैं कि यह काम करना चाहिए? ... – iwayneo

+0

एक ही मुद्दे पर चर्चा की गई है http://stackoverflow.com/questions/4766156/all-viewmodels-inherit-from-baseviewmodel-can-i-set -इस-अप-इन-ऑनएक्शन एक्सचेंज –

उत्तर

7

Controller.ViewData.Model asp.net MVC के में कार्रवाई मानकों को आबाद करने नहीं है:

यहाँ नियंत्रक कोड है। उस संपत्ति का उपयोग कार्रवाई से डेटा को देखने के लिए किया जाता है।

किसी कारण से आप कस्टम मॉडल बाइंडर का उपयोग नहीं करना चाहते, तो आप आप कर सकते थे ActionExecutingContext.ActionParameters Property

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.ActionParameters["model"] = new BaseViewModel(); 
     // etc 
    } 
+1

मुझे वास्तव में इसे स्वीकार करने से नफरत है, लेकिन दूसरों के लिए एक ही गलती करने के लिए: मैंने वास्तव में इस विधि का उपयोग करना शुरू कर दिया, और जब मैंने किसी अन्य क्रिया में विशेषता को जोड़ा तो यह काम करना बंद कर दिया। कारण? मैंने इस कार्रवाई पर अपना मॉडल "इनपुट" नाम दिया था! अब मेरे पास एक चेक है और फेंक दिया गया है यदि विशेषता गलत तरीके से नामित मॉडल के साथ एक क्रिया में जोड़ दी गई है :) – iwayneo

+0

@Iwayneo आप कस्टम मॉडल बाइंडर का उपयोग क्यों नहीं करेंगे? – archil

2

थोड़ी देर हो चुकी (मानक, asp.net-MVC में कार्रवाई मानकों को आबाद करने का सिफारिश की जिस तरह से है) उत्तर के लिए लेकिन यह दूसरों के लिए उपयोगी होगा। हम केवल हमारी विशेषता को सजावट के द्वारा OnActionExecuting में मॉडल का मूल्य प्राप्त कर सकते हैं।

इस हमारे फ़िल्टर कक्षा

public sealed class TEST: ActionFilterAttribute 
{ 

    /// <summary> 
    /// Model variable getting passed into action method 
    /// </summary> 
    public string ModelName { get; set; } 

    /// <summary> 
    /// Empty Contructor 
    /// </summary> 
    public TEST() 
    { 
    } 

    /// <summary> 
    /// This is to get the model value by variable name passsed in Action method 
    /// </summary> 
    /// <param name="modelName">Model variable getting passed into action method</param> 
    public TEST(string modelName) 
    { 
     this.ModelName = modelName; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var result = filterContext.ActionParameters.SingleOrDefault(ap => ap.Key.ToLower() == ModelName.ToString()).Value; 
    } 

} 

    THIS IS OUR ACTION METHOD PLEASE NOTE model variable has to be same 
    [HttpPost] 
    [TEST(ModelName = "model")] 
    public ActionResult TESTACTION(TESTMODEL model) 
    { 
    } 

है और यह thats ..... वोट करें आप उत्तर