2015-09-03 7 views
17

मैंने एक कस्टम एमवीसी मॉडल बाइंडर बनाया है जो सर्वर में आने वाले प्रत्येक HttpPost के लिए बुलाया जाता है। लेकिन HttpGet अनुरोधों के लिए बुलाया नहीं जाता है।जीईटी अनुरोध पर एएसपी.नेट एमवीसी के लिए कस्टम मॉडल बाइंडर

  • क्या मेरे कस्टम मॉडल बाइंडर को GET के दौरान बुलाया जाना चाहिए? यदि हां, तो मुझे क्या याद आया?
  • यदि नहीं, तो अनुरोध से QueryString को संभालने वाले कस्टम कोड को मैं कैसे लिख सकता हूं?

यहाँ मेरी कार्यान्वयन Global.asax

protected void Application_Start() 
{ 
    ModelBinders.Binders.DefaultBinder = new CustomModelBinder(); 
    //... 
} 

मैं इन समाधानों में देखा गया है ...

public class CustomModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     // This only gets called for POST requests. But I need this code for GET requests. 
    } 
} 

, पर वे मैं क्या कर रहा हूँ के लिए काफी नहीं काम करते हैं खोज रहे हैं:

  • के माध्यम से जटिल प्रकारों को जारी रखना
  • डिफ़ॉल्ट बांधने की मशीन का उपयोग करना

    धन्यवाद जटिल प्रकार (?Name=John&Surname=Doe) जवाब पर

टिप्पणी का निर्माण करने में मदद के लिए @Felipe करने के लिए। शायद ज़रुरत पड़े तो कोई और उसी के साथ संघर्ष, मुझे पता चला:

  • बांधने की मशीन GET अनुरोध
  • आप CAN उपयोग DefaultModelBinder वर्ग के लिए इस्तेमाल किया जा सकता है कस्टम मॉडल
  • मेरे रोड़ा था कि कार्रवाई विधि में पैरामीटर होना चाहिए (अन्यथा मॉडल बाइंडर GET अनुरोधों के लिए छोड़ दिया गया है, जो आपको इसके बारे में सोचने पर समझ में आता है)

+0

आप उपयोग कर सकते हैं [OnActionExecuting] (https://msdn.microsoft प्रत्येक अनुरोध को फ़िल्टर करने के लिए .com/en-us/library/dd493080% 28v = vs.98% 29.aspx) और उस विधि में आप 'अनुरोध' का उपयोग कर क्वेरी स्ट्रिंग प्राप्त कर सकते हैं। –

+0

@JSantosh, मान लें कि मैंने ऐसा किया है और 'ऑनएक्शन एक्सेलिंग' में मेरी 'क्वेरीस्ट्रिंग' पकड़ लिया है। मैं क्वेरी ऑब्जेक्ट को किसी ऑब्जेक्ट में अनुवाद करने में सक्षम नहीं हूं और इसे क्रिया विधि के पैरामीटर के रूप में पास कर सकता हूं? जो मुझे एक ही परिस्थिति के साथ छोड़ देता है। –

+0

पोस्ट अनुरोध में आपको डेटा के रूप में डेटा मिलता है जिसे स्वचालित रूप से संबंधित मॉडल में पार्स किया जाता है, लेकिन आपको डेटा को स्ट्रिंग के रूप में प्राप्त करने में, मुझे यकीन नहीं है कि आप इसे प्राप्त कर सकते हैं। और अच्छा सवाल :) –

उत्तर

18

मान लें कि आपके पास अपना स्वयं का प्रकार है जिसे आप बांधना चाहते हैं। Global.asax में Application_Start घटना में

public class PersonModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var request = controllerContext.HttpContext.Request; 

     int id = Convert.ToInt32(request.QueryString["id"]); 
     string name = request.QueryString["name"]; 
     int age = Convert.ToInt32(request.QueryString["age"]); 
     // other properties 

     return new Person { Id = id, Name = name, Age = age }; 
    } 
} 

, तो आप इस मॉडल बाँध रजिस्ट्री कर सकते हैं,:

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
    // other properties you need 
} 

आप एक कस्टम मॉडल बाँध इस विशिष्ट प्रकार के लिए, नमूने के लिए बना सकते हैं DefaultModelBinder से inherithing, नमूने के लिए:

// for Person type, bind with the PersonModelBinder 
ModelBinders.Binders.Add(typeof(Person), new PersonModelBinder()); 

PersonModelBinder से BindModel विधि में, सुनिश्चित करें कि आप में querystring एक सभी मापदंडों कर उन्हें आदर्श उपचार दें।

जब से तुम इस कार्रवाई विधि है:

public ActionResult Test(Person person) 
{ 
    // process... 
} 

आप इस तरह एक यूआरएल कुछ के साथ इस कार्रवाई का उपयोग कर सकते हैं:

Test?id=7&name=Niels&age=25 
+0

विस्तृत उत्तर के लिए धन्यवाद। मैं 'DefaultModelBinder' का उपयोग कर रहा हूं (मेरा प्रश्न देखें) और यह ** ** ** ** अनुरोध के दौरान केवल ** POST ** के लिए हिट नहीं लग रहा है। क्या आपकी 'बिंदमोडेल' विधि को 'HttpGet' के लिए भी बुलाया जाता है? –

+0

मैंने यहां परीक्षण किया है और 'टेस्ट' एक्शन विधि में मुझे 'व्यक्ति' पैरामीटर भर गया है ठीक है। सुनिश्चित करें कि आपने अपने कस्टम प्रकार के लिए कस्टम बाइंड पंजीकृत किया है। याद रखें आपको 'request.QueryString' से भी पढ़ने की आवश्यकता है। –

+0

शानदार, तो मैंने अपनी तरफ से कुछ याद किया है। मुझे चारों ओर खेलने दो और आप वापस आते हैं। धन्यवाद। –

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