2012-07-30 12 views
6

में हेडर स्वीकार करें। मैं .NET MVC 3 में एक आरईएसटी परत लागू कर रहा हूं। मैं यह निर्धारित करने के लिए स्वीकृति हेडर को पकड़ने के लिए एक साफ तरीका ढूंढ रहा हूं कि मुझे जेसन या एक्सएमएल वापस करना चाहिए या नहीं।बीआईटी मॉडल करने का सबसे साफ तरीका .NET MVC

मैं डीबगिंग के लिए एक जीईटी पैरामीटर के साथ इस हेडर को धोखा देने में सक्षम होना चाहूंगा (मैं चाहता हूं कि यह भी प्रोडक्ट जारी रहे)।

यहाँ कैसे मैं इस समय इस का पता लगाने हूँ:

if (Request.AcceptTypes.Contains("application/json") || Request.Url.Query.Contains("application/json")) 

यह है कि अनुरोध वस्तु को छूता सीधे मेरी नियंत्रक कोड में एकमात्र ऐसा स्थान है। मैं इसे पढ़ने के लिए एक क्लीनर, अधिक टेस्टेबल तरीका चाहूंगा। मेरा आदर्श समाधान नियंत्रक पर एक पैरामीटर होगा।

मैंने कई कीवर्ड की कोशिश की ताकि यह देखने के लिए कि डिफ़ॉल्ट मॉडल बाइंडर उस पर उठाएगा, लेकिन मैंने कुछ भी करने की कोशिश नहीं की।

तो इस जानकारी को पाने का सबसे साफ तरीका क्या है? एक कस्टम मॉडल बांधने की मशीन? क्या आप एक उदाहरण प्रदान कर सकते हैं?

+0

यदि आप mvc4 webapi का विरोध नहीं कर रहे हैं तो आप इसे अपने लिए संभाले जा सकते हैं। भविष्य में किसी बिंदु पर जब आप अपने ऐप को mvc4 + पर माइग्रेट करते हैं तो उल्लेख नहीं करना चाहिए कि आप कुछ एमवीसी पहले से ही आपके लिए कर रहे हैं। अधिक जानकारी के लिए एमवीसी 4 सामग्री प्रकार बातचीत खोजें। –

+0

मैंने यह देखा है और इसके बारे में बहुत उत्साहित हूं, लेकिन दुर्भाग्यवश मैं इस परियोजना को आरसी के तहत नहीं दे सकता, और जो मैं कह सकता हूं उससे 4 रिलीज की तारीख नहीं है। – Travis

+0

http://prideparrot.com/blog/संग्रह/2012/3/returning_data_view_from_controller_action – VJAI

उत्तर

2

एक एक्शन फ़िल्टर विशेषता एक अच्छा, साफ समाधान होगा।

वहाँ एक अच्छा यहाँ ट्यूटोरियल है: http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/understanding-action-filters-cs

+0

उत्तर के लिए धन्यवाद, लेकिन अगर मैं इसे सही ढंग से समझता हूं, तो मुझे प्रत्येक क्रिया को डुप्लिकेट करने की आवश्यकता होगी - एक एक्सएमएल के लिए और एक जेसन के लिए। यह सिर्फ encapsulation और testability के लिए थोड़ा अधिक लगता है। या क्या मैं कुछ न कुछ भूल रहा हूं? – Travis

+1

आप इसे वैश्विक एक्शन फ़िल्टर के रूप में पंजीकृत कर सकते हैं और एक्सएमएल और जेसन दोनों को एक फ़िल्टर में संभाला है .. क्या यह नहीं है कि आप क्या कर रहे हैं? आपको अभी भी इसे ViewData/Bag में संग्रहीत करने की आवश्यकता होगी जो मुझे लगता है कि "साफ" नहीं है .. –

2

मैं कस्टम मॉडल बांधने की मशीन के लिए किसी भी बेहतर विकल्प नहीं दिख रहा है। यदि कोई और इसे देखता है तो मैं यहां बांधने की मशीन के कार्यान्वयन को पोस्ट करूंगा। मॉडल बाइंडर का उपयोग करने से स्वीकृति हेडर को कार्रवाई पर सीधे इनपुट के लिए मजबूती से बंधने की अनुमति मिलती है, जिससे रिटर्न प्रकारों के प्रत्यक्ष परीक्षण की अनुमति मिलती है और आपको कृत्रिम रूप से कृत्रिम रूप से अधिक क्रियाएं करने की आवश्यकता नहीं होती है, न ही गतिशील टाइप किए गए व्यूडेटा/बैग।

यहाँ एक समर्थन enum प्रकार के साथ मॉडल बाइंडर है:

public enum RequestAcceptType 
{ 
    NotSpecified, 
    Json, 
    Xml 
} 

public class RequestAcceptTypeModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (bindingContext == null) 
     { 
      throw new ArgumentNullException("bindingContext"); 
     } 

     RequestAcceptType acceptType = RequestAcceptType.NotSpecified; 

     // Try for Json 
     if (controllerContext.HttpContext.Request.AcceptTypes.Contains("application/json") || controllerContext.HttpContext.Request.Url.Query.Contains("application/json")) 
     { 
      acceptType = RequestAcceptType.Json; 
     } 

     // Default to Xml 
     if (acceptType == RequestAcceptType.NotSpecified) 
     { 
      acceptType = RequestAcceptType.Xml; 
     } 

     return acceptType; 
    } 
} 

यहाँ Application_Start विधि में Global.asax में प्रासंगिक सा है:

ModelBinders.Binders[typeof(RequestAcceptType)] = new RequestAcceptTypeModelBinder(); 

फिर अपने कार्यों में इसका इस्तेमाल करने के लिए, बस enum टाइप के साथ एक तर्क (कोई नाम) बनाएं:

public ActionResult Index(RequestAcceptType acceptType) 

यदि कोई भी अब के साथ जवाब नहीं देता है कुछ दिनों में ईटर विधि, मैं इसे उत्तर के रूप में स्वीकार करूंगा।

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