asp.net mvc एएसपी.नेट एमवीसी 3-आंशिक बनाम डिस्प्ले टेम्पलेट बनाम संपादक टेम्पलेट




asp.net-mvc asp.net-mvc-3 (4)

बस अपना 2 सी लायक देने के लिए, हमारी परियोजना कई jQuery टैब के साथ आंशिक दृश्य का उपयोग कर रही है, और प्रत्येक टैब अपने क्षेत्र को अपने आंशिक दृश्य के साथ प्रस्तुत करता है। यह ठीक काम करता है जब तक कि हमने एक सुविधा नहीं जोड़ा जिससे कुछ टैबों ने कुछ सामान्य फ़ील्ड साझा किए। इसका हमारा पहला दृष्टिकोण इन आम क्षेत्रों के साथ एक और आंशिक दृश्य बनाना था, लेकिन यह फ़ील्ड और ड्रॉप डाउन को प्रस्तुत करने के लिए EditorFor और DropDownListFor का उपयोग करते समय बहुत गड़बड़ हो गया। आईडी और नामों को अद्वितीय बनाने के लिए हमें मूलभूत आंशिक दृश्य के आधार पर फ़ील्ड को उपसर्ग के साथ प्रस्तुत करना था जो इसे प्रस्तुत कर रहा था:

    <div id="[email protected](idPrefix)2" class="[email protected](idPrefix)" style="display:none">
    <fieldset>
        <label for="@(idPrefix).Frequency">Frequency<span style="color: #660000;"> *</span></label>

        <input name="@(idPrefix).Frequency"
               id="@(idPrefix)_Frequency"
               style="width: 50%;"
               type="text"
               value="@(defaultTimePoint.Frequency)"
               data-bind="value: [email protected](viewStatePrefix).RecurringTimepoints.Frequency"
               data-val="true"
               data-val-required="The Frequency field is required."
               data-val-number="The field Frequency must be a number."
               data-val-range-min="1"
               data-val-range-max="24"
               data-val-range="The field Frequency must be between 1 and 24."
               data-val-ignore="true"/>

        @Html.ValidationMessage(idPrefix + ".Frequency")

        ... etc

    </fieldset>
</div>

यह बहुत बदसूरत हो गया, इसलिए हमने इसके बजाय संपादक टेम्पलेट का उपयोग करने का फैसला किया, जिसने बहुत साफ सफाई की। हमने सामान्य फ़ील्ड के साथ एक नया व्यू मॉडल जोड़ा, एक मिलान संपादक टेम्पलेट जोड़ा, और विभिन्न मूल दृश्यों से संपादक टेम्पलेट का उपयोग करके फ़ील्ड प्रदान किया। संपादक टेम्पलेट सही ढंग से आईडी और नाम प्रस्तुत करता है।

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

तो, शीर्षक खुद के लिए बात करनी चाहिए।

एएसपी.नेट एमवीसी में पुनः उपयोग करने योग्य घटकों को बनाने के लिए, हमारे पास 3 विकल्प हैं (अन्य जिन्हें मैंने उल्लेख नहीं किया है):

आंशिक दृश्य:

@Html.Partial(Model.Foo, "SomePartial")

कस्टम संपादक टेम्पलेट:

@Html.EditorFor(model => model.Foo)

कस्टम प्रदर्शन टेम्पलेट:

@Html.DisplayFor(model => model.Foo)

वास्तविक दृश्य / एचटीएमएल के संदर्भ में, सभी तीन कार्यान्वयन समान हैं:

@model WebApplications.Models.FooObject

<!-- Bunch of HTML -->

तो, मेरा सवाल यह है कि - आप कैसे तय करते हैं कि तीनों में से किस का उपयोग करना है?

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

संपादकफॉर / डिस्प्लेफॉर के साथ मुझे 2 चीजें बेहतर मिली हैं:

  1. एचटीएमएल हेल्पर्स को प्रस्तुत करते समय वे मॉडल पदानुक्रमों का सम्मान करते हैं (उदाहरण के लिए यदि आपके "फू" मॉडल पर "बार" ऑब्जेक्ट है, तो "बार" के लिए HTML तत्व "Foo.Bar.ElementName" के साथ प्रस्तुत किए जाएंगे, जबकि आंशिक " ElementName ")।

  2. अधिक मजबूत, उदाहरण के लिए यदि आपके @Html.DisplayFor(model => model.CollectionOfFoo) में कुछ की List<T> थी, तो आप @Html.DisplayFor(model => model.CollectionOfFoo) उपयोग कर सकते हैं, और एमवीसी एक संग्रह देखने के लिए पर्याप्त स्मार्ट है और एकल डिस्प्ले प्रस्तुत करता है प्रत्येक आइटम के लिए (आंशिक के विपरीत, जिसके लिए लूप के लिए एक स्पष्ट आवश्यकता होगी)।

मैंने यह भी सुना है कि DisplayFor एक "केवल-पढ़ने" टेम्पलेट प्रस्तुत करता है, लेकिन मुझे यह समझ में नहीं आता - क्या मैं वहां कोई फॉर्म नहीं फेंक सकता?

क्या कोई मुझे कुछ अन्य कारण बता सकता है? क्या तीनों की तुलना कहीं कहीं एक सूची / आलेख है?


_partial व्यू दृष्टिकोण का प्रयोग करें यदि:

  1. केंद्रित तर्क देखें
  2. केवल इस दृश्य में सभी _partial व्यू संबंधित HTML को रखने के लिए क्या करें। टेम्पलेट विधि में, आपको कुछ HTML को टेम्पलेट व्यू के बाहर "मुख्य शीर्षलेख या किसी बाहरी सीमा / सेटिंग्स जैसे रखना होगा।
  3. URL.Action("action","controller") का उपयोग करके तर्क (नियंत्रक से) के साथ आंशिक दृश्य प्रस्तुत करना चाहते हैं।

टेम्पलेट का उपयोग करने के कारण:

  1. ForEach(Iterator) को हटाना चाहते हैं। टेम्पलेट सूची सूची के रूप में मॉडल की पहचान करने के लिए पर्याप्त है। यह स्वचालित रूप से यह करेगा।
  2. मॉडल केंद्रित तर्क। यदि टेम्पलेट फ़ोल्डर के लिए एक ही डिस्प्ले में एकाधिक दृश्य पाए जाते हैं, तो प्रतिपादन उत्तीर्ण मॉडल पर निर्भर करेगा।

EditorFor बनाम सरल है। विधियों का अर्थशास्त्र संपादन / सम्मिलित करना और प्रदर्शित करना / केवल दृश्य (क्रमशः) पढ़ना है। डेटा प्रदर्शित करते समय DisplayFor उपयोग करें (यानी जब आप divs और spans उत्पन्न करते हैं जिसमें मॉडल मान होते हैं)। डेटा का संपादन / डालने के दौरान संपादक का उपयोग करें (यानी जब आप किसी फ़ॉर्म के अंदर इनपुट टैग जेनरेट करते हैं)।

उपरोक्त विधियां मॉडल केंद्रित हैं। इसका मतलब यह है कि वे मॉडल मेटाडेटा को खाते में ले जाएंगे (उदाहरण के लिए आप अपने मॉडल क्लास को [UIHintAttribute] या [DisplayAttribute] साथ एनोटेट कर सकते हैं और इससे यह प्रभावित होगा कि मॉडल के लिए UI उत्पन्न करने के लिए कौन सा टेम्पलेट चुना जाता है। इनका उपयोग आमतौर पर भी किया जाता है डेटा मॉडल (यानी मॉडल जो डेटाबेस में पंक्तियों का प्रतिनिधित्व करते हैं, आदि)

दूसरी ओर Partial दृश्य-केंद्रित है जिसमें आप अधिकतर आंशिक दृश्य चुनने से अधिक चिंतित हैं। दृश्य को सही ढंग से कार्य करने के लिए मॉडल की आवश्यकता नहीं है। इसमें सिर्फ मार्कअप का एक सामान्य सेट हो सकता है जो पूरे साइट पर पुन: उपयोग किया जाता है। बेशक अक्सर आप इस आंशिक के व्यवहार को प्रभावित करना चाहते हैं, इस मामले में आप एक उपयुक्त दृश्य मॉडल में गुजरना चाहेंगे।

आपने @Html.Action बारे में नहीं पूछा जो यहां उल्लेख का हकदार है। आप इसे Partial अधिक शक्तिशाली संस्करण के रूप में सोच सकते हैं जिसमें यह एक नियंत्रक बाल क्रिया निष्पादित करता है और फिर एक दृश्य प्रस्तुत करता है (जो आमतौर पर आंशिक दृश्य होता है)। यह महत्वपूर्ण है क्योंकि बाल क्रिया अतिरिक्त व्यावसायिक तर्क निष्पादित कर सकती है जो आंशिक दृश्य में नहीं है। उदाहरण के लिए यह एक शॉपिंग कार्ट घटक का प्रतिनिधित्व कर सकता है। इसका उपयोग करने का कारण आपके आवेदन में प्रत्येक नियंत्रक में शॉपिंग कार्ट से संबंधित काम करने से बचाना है।

आखिरकार पसंद इस बात पर निर्भर करती है कि आप अपने आवेदन में मॉडलिंग कर रहे हैं। यह भी याद रखें कि आप मिश्रण और मैच कर सकते हैं। उदाहरण के लिए आपके पास आंशिक दृश्य हो सकता है जो EditorFor सहायक को कॉल करता है। यह वास्तव में निर्भर करता है कि आपका आवेदन क्या है और दोहराव से बचने के दौरान अधिकतम कोड पुन: उपयोग को प्रोत्साहित करने के लिए इसे कैसे कारक बनाना है।


संपादन योग्य रूप प्रदर्शित करने के लिए आप निश्चित रूप से DisplayFor को कस्टमाइज़ कर सकते हैं । लेकिन सम्मेलन EditorFor लिए EditorFor जा सकता है और EditorFor को संपादन के लिए होना चाहिए। सम्मेलन के साथ चिपके रहने से यह सुनिश्चित होगा कि आप DisplayFor में जो भी गुजरते हैं, वह वही काम करेगा।





editortemplates