2010-02-04 8 views
11

(मैं एमवीसी के लिए नया हूँ)।एएसपी.नेट एमवीसी: क्या होगा यदि आपका मॉडल सिर्फ एक शब्दकोश है?

मेरे आवेदन में मेरे पास गुणों वाले वर्ग की भावना में कोई मॉडल नहीं है। ओह नहीं, यह बहुत आसान है: मेरे उपयोगकर्ता मूल रूप से सिस्टम में कहीं और विभिन्न कुंजी सेटअप के लिए स्ट्रिंग मानों का एक गुच्छा भरते हैं (चाबियाँ मनमाने ढंग से होती हैं और समय से पहले ज्ञात नहीं होती हैं, इस प्रकार कोई प्री-कोडेड क्लास नहीं) ।

मेरे "मॉडल" इस प्रकार बस है:

Dictionary<string, string> 
सुंदर सरल

जैसा कि मैं समझता हूं कि यह मॉडल बाध्यकारी, एचटीएमएल सहायक, मॉडल स्थिति, सत्यापन सारांश सभी मनमानी वर्ग 'गुण के प्रतिबिंब पर भरोसा करते हैं। लेकिन क्या वे इसके बजाय मेरे शब्दकोश में कुंजी/मानों का उपयोग कर सकते हैं?

उदाहरण के लिए, मैं हो सकता है:

<label for="Name">Name:</label> 
<%= Html.TextBox("Name") %> 
<%= Html.ValidationMessage("Name", "*") %> 

और:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dictionary<string, string> valuesEntered) 
{    
    // ... 
} 

और के रूप में मेरे Dictionary<string, string> "मॉडल" में पाया अपने सभी के पीछे करने के लिए MVC "Name" कुंजी/मान का उपयोग करें दृश्यों जादू? (एमवीसी 1.0 प्राथमिकता से, लेकिन कृपया कुछ प्रकाश डालें अगर यह 2.0 में बेहतर ढंग से संबोधित किया गया है जैसा कि मैं अभी भी जानना चाहता हूं)?


1: मूर्खतापूर्ण लगता है मुझे यकीन है। यह एक रिपोर्टिंग ऐप के लिए है, जहां "कुंजी" रिपोर्ट पैरामीटर नाम हैं और "मान" वे मान हैं जिनके साथ रिपोर्ट चलती है।

+0

क्या आप हमें अपना आवेदन (या इसका विशिष्ट भाग) पूरा करने के बारे में अधिक जानकारी दे सकते हैं? 'डिक्शनरी' के लिए एक वैकल्पिक समाधान दिया जा सकता है, थोड़ा और विस्तार मदद करेगा। – Omar

+0

@Baddie: यह एक गतिशील यूआई है जो एक एसएसआरएस रिपोर्ट के लिए इनपुट एकत्र करता है, जहां "कुंजी" रिपोर्ट पैरामीटर नाम (हमारे रिपोर्टिंग देव द्वारा नामित) हैं और "मान" वे मान हैं जो रिपोर्ट के साथ चलती हैं, द्वारा दर्ज की गई उपयोगकर्ता। अलग-अलग पैरामीटर नामों के साथ प्रत्येक रिपोर्ट अलग होती है। – JPot

उत्तर

4

एमवीसी 1.0 में डिफ़ॉल्ट मॉडल बाइंडर तब तक एक शब्दकोश से जुड़ सकता है जब तक यह जादू फॉर्म फ़ील्ड आइडेंटिफ़र्स 'शब्दकोशनाम [अनुक्रमणिका] .key' और 'dictionaryName [index] .value' का उपयोग करता है, जहां dictionaryName का नाम है आपका शब्दकोश पैरामीटर, और अनुक्रमणिका 0-आधारित अनुक्रमिक संख्या है। आम तौर पर 'कुंजी' मान एक छिपी हुई फ़ील्ड होगी, और 'मान' मान आपका टेक्स्ट फ़ील्ड होगा। आपके उदाहरण में:

<%= Html.Hidden("valuesEntered[0].key", "Name") %> 
<%= Html.TextBox("valuesEntered[0].value") %> 
<%= Html.ValidationMessage("valuesEntered[0].value", "*") %> 

जैसा कि मैं इसे समझता हूं, शब्दकोशों के लिए बाध्यकारी एमवीसी 2 में अलग है।

+0

मैंने कुछ HTML सहायक विस्तार विधियां बनाई हैं यह आपके लिए है: https://github.com/ErikSchierboom/aspnetmvcdictionaryserialization देखें –

0

सच है, एक मॉडल नाम/मूल्य जोड़े के संग्रह के रूप में सरल हो सकता है। आप उस मार्ग पर जा सकते हैं, लेकिन मैं कम से कम अपने वर्ग को कक्षा में लपेटने और कम से कम गुणों या गेटर्स का उपयोग करके सुझाव देता हूं कि आप सड़क के नीचे कुछ लचीलापन दें।

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

संपादित करें: मुझे नहीं लगता कि आपके परिदृश्य के लिए एक लेबल/टेक्स्ट बॉक्स सही यूआई है। एक ग्रिड या एक सूची आज़माएं।

+0

जब तक सी # गतिशील एक्सेसर्स प्रदान नहीं करता है, तो मैं गुणों का उपयोग नहीं कर सकता क्योंकि मुझे नहीं पता कि उन्हें क्या नाम देना है। वे प्रकृति से गतिशील हैं। वह समस्या का क्रूक्स है। – JPot

+0

मुझे नहीं लगता कि आपके परिदृश्य के लिए एक लेबल/टेक्स्ट बॉक्स सही यूआई है। एक ग्रिड या एक सूची आज़माएं। –

+0

@ पॉल सासिक: ठीक है, तो मैं कुंजी/मूल्य जोड़े के प्रत्येक पुनरावृत्ति के अंदर क्या करूं? मैं एक टेक्स्टबॉक्स प्रस्तुत करता हूं जिसका नाम मेरी कुंजी से मेल खाता है, और जिसका मूल्य एमवीसी (उम्मीद है) शब्दकोश या मॉडलस्टेट से बाहर निकल सकता है, है ना? – JPot

0

मैं एक रिपोर्ट नाम-मूल्य जोड़ी के लिए एक मॉडल बनाने का सुझाव दूंगा और फिर इन्हें संग्रहित करने के लिए this (BeginCollectionItem HTML सहायक चर्चा देखें) में उल्लिखित विधि का उपयोग करें।

सत्यापन को विशेष उदाहरण के नियमों के आधार पर नाम-मूल्य जोड़ी मॉडल में डाला जा सकता है।

+0

एक प्रश्न जो आलेख मेरे लिए उठाता है: 'TextBoxFor (x => x [" foo "]) 'work ? मेरा मानना ​​है कि 'XxxFor()' हेल्पर्स केवल * संपत्ति एक्सेसर्स पर काम करते हैं * हालांकि ... – JPot

+0

Thats क्यों मैं सुझाव देता हूं कि आप एक कंक्रीट मॉडल जैसे कि KeyValuePairModel (यानी IENumerable ) का संग्रह उपयोग करते हैं जिसमें कुंजी और मान गुण होते हैं आप/प्रतिबिंबित कर सकते हैं। –

+1

टेक्स्टबॉक्स फोर (x => x ["foo"]) काम नहीं करेगा क्योंकि एमवीसी टेक्स्टबॉक्स फॉर हेल्पर द्वारा उत्पादित इनपुट एचटीएमएल टैग के लिए सार्थक आईडी बनाने में सक्षम नहीं होगा। अपवाद "अमान्य ऑपरेशन अपवाद: टेम्पलेट का उपयोग केवल फ़ील्ड और प्रॉपर्टी एक्सेसर एक्सप्रेशन के साथ किया जा सकता है" इसके बजाय फेंक दिया जाता है। – PanJanek

0

एएसपी के मुताबिक।नेट MVC वास्तुकला आप निम्न चरणों करने की आवश्यकता होगी: में (एक उपयुक्त उदाहरण मैं here पाया)

public class DefaultDictionaryBinder : DefaultModelBinder 
{ 
    //... 
} 
  • स्थानापन्न डिफ़ॉल्ट बांधने की मशीन

    1. अपने स्वयं के बांधने की मशीन बनाएं Application_Start

      ModelBinders.Binders.DefaultBinder = new DefaultDictionaryBinder(); 
      
    2. कार्रवाई फ़िल्टर बनाएं

      public class DictionaryFilter : ActionFilterAttribute 
      { 
          public override void OnActionExecuting(ActionExecutingContext filterContext) 
          { 
           // Process filterContext.HttpContext.Request.InputStream here 
          }  
          //... 
      } 
      
    3. अब अपनी कार्रवाई के लिए फ़िल्टर लागू

      [DictionaryFilter] 
      [AcceptVerbs(HttpVerbs.Post)] 
      public ActionResult Create(Dictionary<string, string> valuesEntered) 
      { 
          //... 
      } 
      
    4. अपने काम :-)

  • 0

    कस्टम मॉडल बांधने की मशीन का निर्माण का आनंद लें एक अच्छा सुझाव है, हालांकि, मैं एक बड़ी समस्या को देखने के मूल्यों की आपूर्ति के लिए एक शब्दकोश का उपयोग करने के साथ: शब्दकोश-आधारित मॉडल कुंजी कैसे प्राप्त करता है? आपकी टिप्पणी के मुताबिक, आप अपने नियंत्रणों को अपनी चाबियों के समान नाम देने की योजना बना रहे हैं। इसलिए, यदि आप पहले से ही अपनी चाबियों के नामों को जानते हैं, तो शब्दकोश बनाने की परेशानी क्यों गुजरती है?

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

    उदाहरण के लिए:

    public class ReportParameterViewModel 
    { 
        public DateTime OrderRangeBegin { get; set; } 
        public DateTime OrderRangeEnd { get; set; } 
        public string Department { get; set; } 
        public int Customer_Number { get; set; } 
        public double Commission_Rate { get; set; } 
        public int Page_Start { get; set; } 
        public int Page_End { get; set; } 
        public bool IsExecutiveVersion { get; set; } 
        // 
        // ...and so on... 
        // 
    } 
    

    सुनिश्चित करें कि आपके नियंत्रक कार्रवाई तरीकों रिपोर्ट उत्पन्न करने के लिए जिम्मेदार ReportParameterViewModel का एक उदाहरण स्वीकार करते हैं और अपनी रिपोर्ट को देखे जाने की सुनिश्चित करें कि सभी कर सकते हैं के सभी ReportParameterViewModel से विरासत करें। शब्दकोश विचार सिर्फ आवश्यकतानुसार अधिक काम की तरह लगता है, इस तथ्य के मुताबिक कि आपकी रिपोर्ट के विचार स्थिर होने की संभावना है।

    +0

    प्रतिक्रिया के लिए धन्यवाद। उदाहरण केवल छोटा था। मैं वास्तव में * * चाबियों को बिल्कुल नहीं जानते। मॉडल वास्तव में 'आईन्यूमेरेबल <पैरामीटर वैल्यू>' जैसा है, जहां 'पैरामीटर वैल्यू' मूल रूप से 'KeyValuePair' है और इस प्रकार, एक शब्दकोश। – JPot

    0

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

    फॉर्म का उपयोग करने से पहले jquery.form.js को एक शब्दकोष के लिए एक जेसन स्ट्रिंग प्रस्तुति में वापस पोस्ट करने के लिए गठबंधन करने के लिए और फिर जेसन स्ट्रिन को एक शब्दकोश में बदलने के लिए जावास्क्रिप्टसेरियलाइज़र का उपयोग करें। शायद, यह स्वचालित रूप से करने के लिए भी समर्थन है।

    सत्यापन के लिए आप क्लाइंट साइड सत्यापन पर भी स्विच कर सकते हैं, उदाहरण के लिए jquery.validate.js का उपयोग करके और जावा विज्ञान स्वचालित रूप से बनाएं।

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