ASP.NET MVC 3 - आंशिक बनाम प्रदर्शन टेम्पलेट बनाम संपादक टेम्पलेट


303

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

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

आंशिक दृश्य:

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

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

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

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

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

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

@model WebApplications.Models.FooObject

<!-- Bunch of HTML -->

तो, मेरा प्रश्न है - आप कब / कैसे तय करते हैं कि तीन में से किसका उपयोग करना है?

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

यहाँ 2 चीजें हैं जिन्हें मैंने EditorFor / DisplayFor के साथ बेहतर पाया है:

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

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

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

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


संपादक और डिस्प्ले टेम्प्लेट के पीछे की अवधारणा को स्पष्ट रूप से asp.net mvc 2 के लिए प्रलेखन में परिभाषित किया गया है। टेम्पलेट एक विशेष सम्मेलन का पालन करने वाले भाग हैं। वे परिस्थितियां जो पुराने पार्टिकल्स की तुलना में बेहतर या बदतर बनाती हैं, यह लगभग पूरी तरह से इस बात पर निर्भर करती है कि सम्मेलन आपके आवेदन में पालन करने लायक है या नहीं।
निक लार्सेन

जवाबों:


301

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

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

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

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

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


4
यह एक महान जवाब है, वास्तव में मैं क्या देख रहा था। वास्तव में मैं इस तथ्य पर बैंकिंग था कि आप आएंगे और इसका जवाब देंगे। :) धन्यवाद मार्सिन।
RPM1984

किसी एकल प्रॉपर्टी के लिए प्रदर्शन टेम्प्लेट और संपादक टेम्प्लेट निर्दिष्ट करने के लिए आप एनोटेशन का उपयोग कैसे करते हैं?
तूफानी

3
@stormwild या तो कन्वेंशन का उपयोग करता है और अपने टेम्प्लेट को उस मॉडल का नाम देता है, जो वे (/Views/DisplayTemplates/MyModel.cshtml) से संबंधित हैं या स्पष्ट रूप से इसे w / UIHint एनोटेशन के लिए मजबूर करते हैं।
टॉम वायसन

कोई सलाह जिसके लिए पुन: प्रयोज्य "रजिस्टर उपयोगकर्ता" विज़ार्ड बनाने के लिए चुनना है? यदि संभव हो तो मैं एक अलग विधानसभा में ये विचार (और नियंत्रक) बनाना चाहता हूं। अका, इन resuable mvc रूपों / नियंत्रकों को कई टीमों के बीच पुनर्वितरित करने का एक तरीका है। (हमने उपयोगकर्ता / भंडारण (वेबापी सेवाओं) को संभालने के लिए एक ही रास्ता बनाया है ... लेकिन प्रत्येक टीम अपना स्वयं का
पीवीसी बना रही है

आप उन टेम्पलेट्स को कहाँ संग्रहीत करते हैं? क्या मुझे उन्हें साझा / EditorTemplates में संग्रहीत करने की आवश्यकता है या क्या उन्हें सीधे वर्तमान नियंत्रक फ़ोल्डर में संग्रहीत करना संभव है (जब मुझे वहां केवल उनकी आवश्यकता है)?
संथोस

15

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


2
मुझे नहीं लगता कि वास्तव में कोई प्रश्न / शंका है जब किसी को संपादक बनाम प्रदर्शन टेम्पलेट का उपयोग करना चाहिए। असली सवाल तब दिखाई देता है जब आपको टेम्प्लेट बनाम भाग का उपयोग करना चाहिए। आपका जवाब पूरी तरह से याद आता है।
जोशुआ हेस

19
@ जोशुआ - मुझे लगता है कि उस पर कुछ सवाल था: "मैंने भी सुना है DisplayFor एक" केवल पढ़ने के लिए "टेम्पलेट प्रदान करता है, लेकिन मुझे समझ नहीं आता कि - क्या मैं वहाँ पर एक फॉर्म नहीं फेंक सकता?"
रॉबर्ट लेवी

13

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

    <div id="div-@(idPrefix)2" class="toHide-@(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: viewState.@(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>

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

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


1
मेरे पास टैब्स का उपयोग करने के लिए एक समान मुद्दा था और स्टीव सैंडर्सन की शुरुआत का उपयोग करके समाप्त हो गया। यह आपके लिए अद्वितीय नियंत्रण आईडी उत्पन्न करता है: blog.stevensanderson.com/2010/01/28/…
विल्की

1

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

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

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

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

1

एक और अंतर जिसका अभी तक उल्लेख नहीं किया गया है, वह यह है कि एक अंशांक मॉडल उपसर्गों को नहीं जोड़ता है जबकि एक टेम्पलेट यहाँ समस्या है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.