MVC

2010-01-07 10 views
5

ASP.NET में क्वेरी स्ट्रिंग में समयदिनाँक के साथ एक ActionLink बनाया जा रहा है मैं एक दिनांक समय खोज कसौटी के साथ एक खोज फ़ॉर्म दिया गया है, के साथ साथ कुछ अन्य मापदंड:MVC

<form method="get" action="/app/search"> 
    <input type="text" value="13/01/2010" name="BeginDate"/> 
    <input type="text" value="blah" name="SomeOtherCriterion"/> 
<form> 

तो मैं एक डिफ़ॉल्ट के साथ खोजें नियंत्रक है एक्शन (चलिए इसे इंडेक्स कहते हैं) और सर्चक्रिटिया पैरामीटर के साथ।

public class SearchController 
{ 
    public ActionResult Index(SearchCriteria searchCriteria) {//blah } 
}  

public class SearchCriteria 
{ 
    public DateTime BeginDate {get; set;} 
    public string SomeOtherCriterion {get; set;} 
} 

अब अगर मैं एक ActionLink बनाने के लिए, एक SearchCriteria मूल्य में गुजर, इस प्रकार हैं:

Html.ActionLink("Search", "Index", searchCriteria) 

मैं अमेरिका प्रारूप में BeginDate क्वेरी स्ट्रिंग पैरामीटर मिलता है। Google पर देख रहे हैं और सिस्टम में चारों ओर घूम रहे हैं। वेब। रिफ्लेक्टर का उपयोग करके रूटिंग ऐसा लगता है क्योंकि यह InvariantCulture का उपयोग करता है, इसलिए इसके बारे में कुछ भी नहीं है।

ऐसा लगता है कि किसी ने इस सवाल से पहले पूछा नहीं है, इसलिए मुझे लगता है कि मैं कुछ बेवकूफ कर रहा हूं .... कृपया मदद करें!

संपादित करें: अज्ञात ऑब्जेक्ट के बजाय SearchCriteria में एक्शनलिंक में पास करें यह दिखाने के लिए कि मैं केवल कस्टम ToString() स्वयं क्यों नहीं कर सकता।

उत्तर

3

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

वहाँ एक बदसूरत विकल्प है - MVC स्रोत डाउनलोड करने और ParsedRoute करने के लिए नीचे Route से सभी हमलावर कक्षाओं के लिए कोड बाहर चीर आपको क्या चाहिए होता है कि अपनी खुद की RouteBase कार्यान्वयन बनाने के लिए।

तो मैं बिल्कुल था SearchCriteria वर्ग पर दिनांक समय घोषणा रखने के लिए है, तो उस मार्ग (यमक के लिए खेद है) मैं चुन जाएगा।

public class MyDateTime 
{ 
    public DateTime Value { get; set; } 
    //for passing MyDateTime in place of a DateTime without casting 
    public static implicit operator DateTime(MyDateTime instance) { return instance.Value; } 
    //so you can assign a MyDateTime from a DateTime without a cast 
    //- e.g. MyDateTime dt = DateTime.Now 
    public static implicit operator MyDateTime(DateTime instance) { return new MyDateTime() { Value = instance }; } 
    //override ToString so that CultureInfo.CurrentCulture is used correctly. 
    public override string ToString() 
    { 
    return Value.ToString(CultureInfo.CurrentUICulture); 
    } 
} 

सिद्धांत रूप में आप रोल में सक्षम होना चाहिए:

हालांकि, एक काफी आसान समाधान इस तरह की एक प्रकार के आधार पर दिनांक समय क्षेत्र के लिए एक अलग घोषणा उपयोग करने के लिए अपने SearchCriteria वर्ग बदलने के लिए, हो सकता है बिना किसी झगड़े के इस बदलाव को बाहर करो।

बड़ा काम करता है, तो आप एक सदस्य का उपयोग करता है (उदाहरण के लिए .Days आदि) SearchCriteria में datetime उदाहरण के कोड का बहुत कुछ है हो सकता है: या तो आप MyDateTime पर पुन: पेश उन सदस्यों के लिए है, भीतरी DateTime Value चारों ओर लपेटकर या सभी को बदलने .Value.Member का उपयोग करने के लिए कोड। क्षेत्रीय सेटिंग और "संस्कृति", से संबंधित

+0

हमारे लिए वास्तव में व्यावहारिक नहीं है लेकिन निश्चित रूप से सबसे आविष्कारशील समाधान है इसलिए मैं इसे स्वीकार करूंगा। धन्यवाद ज़ोलटन। – Gaz

1

क्या आप अपने एक्शनलिंक में एक प्रारूपित तारीख प्रदान कर सकते हैं? इस प्रयास करें:

Html.ActionLink("Search", 
       "Index", 
       new {BeginDate = 
         DateTime.Now.ToString("d", new CultureInfo("pt-BR");}) 
बेशक

इस दिनांक समय के बजाय एक स्ट्रिंग में परिवर्तन BeginDate ... लेकिन शायद यह है कि आप के लिए काम करेंगे?

+0

संपादित देखें। मैं एक अज्ञात ऑब्जेक्ट का उपयोग करने के बजाय सीधे सर्चक्रिटिया पास करने में सक्षम होना चाहता हूं। मुझे पता था कि मैं इस सवाल से कुछ खो रहा था! – Gaz

+0

आह, यह थोड़ा मुश्किल है। मुझे लगता है कि आप हमेशा SearchCriteria अनाम बना सकता है सिर्फ तारीख स्ट्रिंग स्वरूपित करने के लिए है, लेकिन यह एक बहुत बड़ा दर्द हो सकता है ... – womp

+0

कोई आपको womp downvoted। मान लीजिए कि आपको 23000 अंकों की परवाह नहीं है लेकिन यह वैसे भी कठोर लग रहा था। मैं क्षतिपूर्ति करने के लिए upvoted। – Gaz

1

हम इसके लिए आईएसओ ("एस" प्रारूप स्ट्रिंग में - वाई वाई वाई-एमएम-डीडीएचटीएच: एमएम: एसएस) प्रारूप का उपयोग करते हैं। यह सही ढंग से काम करता है, और जावास्क्रिप्ट इसे भी संभाल सकता है।

+1

लेकिन आप एक्शनलिंक या किसी अन्य एमवीसी विधियों को कैसे प्राप्त करते हैं जो रूटआउट को डिक्शनरी को इस प्रारूप में बदलने के लिए उपयोग करते हैं? – Gaz

+0

बस इसे एक स्ट्रिंग के रूप में डाल दिया: 'नई RouteValueDictionary (नए {SomeDate = anotherDate.ToString ("एस")}) ' –

1

शायद आप Model Binder का उपयोग प्रारूप और प्रारूप के लिए कर सकते हैं? बस लेख को दोबारा पढ़ें और ध्यान दिया कि यह तारीख को प्रारूपित नहीं करता है ... शायद काम करने के लिए नहीं जा रहा है। मैं इस सवाल का जवाब छोड़ हालांकि मामले में यह किसी भी अनजाने में प्रेरणा :)

+0

धन्यवाद क्रिस। AFAIK जो आने वाले अनुरोधों को संभालने के लिए केवल अच्छा है, एक्शनलिंक का उपयोग कर यूआरएल बनाने में मदद नहीं करता है। – Gaz

+0

एक ही समय मैं संपादन किया गया था :) –

1
poking around in System.Web.Routing using Reflector it 

क्योंकि यह InvariantCulture

तुम सच इस बारे में shure कर रहे हैं का उपयोग करता प्रतीत हो रहा है प्रदान करता है करेंगे? मॉडलबाइंडिंग और यूआरएल बिल्डिंग के कुछ हिस्सों में मैंने वर्तमान कल्चर का इस्तेमाल किया। क्या आप जांच सकते हैं कि क्या होता है यदि आप लिंक को प्रस्तुत करने से पहले CurrentCulture सेट करते हैं?

+0

बिट मैं देख रहा हूँ पर टिप्पणी की System.Web.Routing.ParsedRoute.Bind है। नीचे की ओर जहां यह क्वेरी स्ट्रिंग में कोई "अप्रयुक्त मान" रखता है। (हालांकि इस पद्धति में हर ToString का उपयोग करता InvariantCulture।) मैं CurrentCulture स्थापित करने की कोशिश की। यह मदद नहीं करता है। – Gaz

2

से बचने के लिए मुद्दों मैं अलग अनबाउंड क्षेत्रों के रूप में की तारीख और समय का इलाज और फिर उन्हें दिनांक समय में इकट्ठा मेरी नियंत्रक में।

उदाहरण:

Year [ ] Month [ ] Day [ ]

मैं हमेशा के लिए मौजूद अलग बक्सें साल, महीना, और दिन, इसी क्रम ताकि अमेरिका प्रारूप (माह/दिन/वर्ष) और अधिक के बीच कोई भ्रम हो सकता है में या बाकी दुनिया के प्रारूप (दिन/महीने/वर्ष) कम।

1

ASP.NET MVC पुस्तक 1.0 स्कॉट Hanselman, स्कॉट गुथरी, फिल Haack, और रोब Conery के द्वारा लिखित प्राप्त करें। वे वास्तव में पुस्तक में यह सटीक परिदृश्य करते हैं। वे एक विशिष्ट मार्ग का उपयोग करते हैं। मैं दिन, महीना, और साल को तोड़ने से पेज 216.

वे इसे करते हैं पर अभी इसे देख रहा हूँ। फिर उन मूल्यों का उपयोग करना आपकी ज़िम्मेदारी है क्योंकि वे वापस आते हैं।