MVC रेजर @foreach


82

मैंने सुना है कि एक दृश्य के अंदर @foreach होना कोई नहीं है। मतलब, दृश्य में कोई तर्क नहीं होना चाहिए। जहां पर @foreach के लिए तर्क होना चाहिए वहां सबसे अच्छा अभ्यास क्या है?

    @foreach.. 

5
आपने कहाँ पढ़ा है? तर्क क्या उस्तरा के लिए है!
निकोलस किंग

4
कृपया निम्न ms ट्यूटोरियल asp.net/web-pages/tutorials/basics/…
निकोलस किंग

जवाबों:


162

जहां पर @foreach के लिए तर्क होना चाहिए वहां सबसे अच्छा अभ्यास क्या है?

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

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

@foreach (var item in Model.Foos)
{
    <div>@item.Bar</div>
}

पूरी तरह से ठीक एक प्रदर्शन टेम्पलेट द्वारा प्रतिस्थापित किया जा सकता है:

@Html.DisplayFor(x => x.Foos)

और फिर आप संबंधित प्रदर्शन टेम्पलेट को परिभाषित करेंगे (यदि आप डिफ़ॉल्ट को पसंद नहीं करते हैं )। तो आप एक पुन: प्रयोज्य टेम्पलेट को परिभाषित ~/Views/Shared/DisplayTemplates/Foo.cshtmlकरेंगे, जो कि फोस संग्रह के प्रत्येक तत्व के लिए फ्रेमवर्क द्वारा स्वचालित रूप से प्रदान किया जाएगा ( IEnumerable<Foo> Foos { get; set; }):

@model Foo
<div>@Model.Bar</div>

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


3
@DarinDimitrov यह सच है कि अगर इसका सख्त MVC मॉडल है, तो आप इसके खिलाफ कोडिंग कर रहे हैं, लेकिन अगर कोई परिस्थिति उत्पन्न होती है, जहां एक संग्रह के माध्यम से खामियों को दूर करने की आवश्यकता होती है, तो मैं मॉडल के साथ समस्या नहीं देख सकता
निकोलस किंग

6
@ निकोलसिंग, ऐसी परिस्थिति कभी पैदा नहीं होनी चाहिए। कंट्रोलर एक्शन द्वारा पास किए गए व्यू मॉडल में मौजूद दृश्य के अलावा कोई दृश्य कुछ और नहीं छूना चाहिए। यदि यह दृश्य मॉडल में नहीं है, तो आपको इसे वहां रखना चाहिए यदि दृश्य को इसकी आवश्यकता है। ठीक यही दृश्य मॉडल के लिए हैं।
डारिन दिमित्रोव

1
@MihaiLabo, हां, मैं यही कह रहा हूं।
डारिन दिमित्रोव

2
क्या होगा अगर संग्रह में तत्व का प्रकार प्रदर्शन को निर्धारित करने के लिए पर्याप्त नहीं है? उदाहरण के लिए, मेरे मॉडल में स्ट्रिंग्स का एक संग्रह है, लेकिन कभी-कभी मैं प्रति पंक्ति एक स्ट्रिंग करना चाहता हूं और दूसरे मामले में मैं चाहता हूं कि वे कॉमा से अलग हो जाएं?
मार्क स्टैबर

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

98

जब लोग कहते हैं कि विचारों में तर्क मत रखो, वे आमतौर पर व्यावसायिक तर्क की बात करते हैं, तर्क का प्रतिपादन नहीं करते। मेरी विनम्र राय में, मुझे लगता है कि विचारों में @foreach का उपयोग करना पूरी तरह से ठीक है।


22
माना। मुझे पुराने शब्दार्थ HTML वाद-विवादों की याद दिलाता है, जो अंततः लोगों को वास्तविक सारणीबद्ध डेटा के लिए "तालिका" बनाने के लिए divs और CSS का उपयोग करने की कोशिश कर रहा था, क्योंकि वे इतने विरोधी तालिका थे।
क्रिस प्रैट

1
मैं सहमत हूँ। मनुष्य गलत दिशा में बुरा है। क्या मुझे वास्तव में एक नए फ़ोल्डर की आवश्यकता है, एक नए दृश्य के साथ, बस अपने व्यूमोडेल की सूची में चीजों को प्रदर्शित करने के लिए?
डॉन चीडले

1
एक उत्तरदायी दृश्य बनाने के लिए सारणीबद्ध डेटा दृश्य बनाने के लिए div / css का उपयोग नहीं किया जाएगा?
१४:१

13

मैं उपयोग कर रहा हूँ @foreachजब मैं एक इकाई है कि (1 दृश्य में 2 ग्रिड प्रदर्शित करने के लिए उदाहरण के लिए) संस्थाओं की एक सूची है भेजने

उदाहरण के लिए यदि मैं मॉडल फू के रूप में संस्था को भेज रहा हूँ जिसमें शामिल है Foo1(List<Foo1>)औरFoo2(List<Foo2>)

मैं पहली सूची के साथ उल्लेख कर सकते हैं:

@foreach (var item in Model.Foo.Foo1)
{
    @Html.DisplayFor(modelItem=> item.fooName)
}

11

एक मामले के लिए @DarinDimitrov के लिए एक जवाब जहां मैंने एक रेजर दृश्य में फोरच का उपयोग किया है।

<li><label for="category">Category</label>
        <select id="category">
            <option value="0">All</option>
            @foreach(Category c in Model.Categories)
            {
                <option title="@c.Description" value="@c.CategoryID">@c.Name</option>
            }
        </select>
</li>

6
वाह यार, तुम एक दृश्य में ऐसा कुछ लिखोगे? क्यों नहीं एक पुन: प्रयोज्य कस्टम सहायक ला ला लिखो जो Html.DropDownListForबस शीर्षक को ध्यान में रखेगा? यह तुच्छ है और स्पेगेटी कोड में आपके विचार नहीं बदलते हैं: stackoverflow.com/a/7938038/29407
डारिन दिमित्रोव

7
@DarinDimitrov हाँ हम एक बहुत ही चुस्त वातावरण में काम करते हैं, जिसका अर्थ है कि इस तरह के परिदृश्य कभी-कभी हमें ड्रॉपडाउनफ़ोर जैसी चीजों का उपयोग करने से रोकते हैं क्योंकि हमारे पास हमेशा स्पष्ट रूप से परिभाषित आवश्यकता नहीं होती है। मेरा मानना ​​है कि इस मामले में शुरुआत में ड्रॉप डाउन को "सभी" की जरूरत नहीं थी, लेकिन यह केवल एक ड्रॉपडाउन में किया गया था। जैसा कि यह पृष्ठ ajax का उपयोग करता है अपने सख्त MVC पैटर्न को अपडेट करने के लिए नहीं करता है और आप किसी उत्पाद को आवश्यकता के अनुसार सभी श्रेणियों में अपलोड कर सकते हैं। आदर्श नहीं है लेकिन कभी-कभी अपरिहार्य है।
निकोलस किंग

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

यह एजाइल की मेरी परिभाषा नहीं होगी - मुझे @DarinDimitrov से सहमत होना होगा
लुइस फ़िलिप

3

टेम्पलेट को इंगित करने के लिए अधिभार का उपयोग करते समय उत्तर काम नहीं करेगा @Html.DisplayFor(x => x.Foos, "YourTemplateName)

लगता है कि इस तरह से डिजाइन किया गया है, इस मामले को देखें । इसके अलावा, जो फ्रेमवर्क अपवाद देता है (उस प्रकार के बारे में जैसा कि अपेक्षित नहीं था) काफी भ्रामक है और मुझे पहली कोशिश में बेवकूफ बनाया (धन्यवाद @CodeCaster)

इस मामले में आपको उपयोग करना होगा@foreach

@foreach (var item in Model.Foos)
{
    @Html.DisplayFor(x => item, "FooTemplate")
}

यह उत्तर किसी ऐसे व्यक्ति द्वारा लिखा गया है जो एमवीसी पर काम करता है, इसलिए मुझे लगता है कि वे जानते हैं कि वे क्या कह रहे हैं। MVC प्रत्येक तत्व के लिए IEnumerable<T>टेम्पलेट को टाइप करेगा और कॉल करेगा T
कोडकास्टर

आपके संपादन के बारे में: यह या तो आपका कोड गलत है या उस विशिष्ट MVC संस्करण में बग (5.2.2 में यह मेरे लिए काम करता है)। यह स्वीकार किए गए उत्तर में वर्णित के रूप में काम करने वाला है। यह गलत है कहने के बजाय, यदि आप चाहते हैं तो इस मुद्दे के बारे में अपना प्रश्न खोलें।
कोडकास्टर

@CodeCaster मेरा मानना ​​है कि मेरी प्रतिक्रिया उस विशिष्ट मामले के लिए कुछ सिर जोड़ देती है (यह पता लगाने में मेरा कुछ समय बर्बाद हो गया कि क्या गलत हुआ)। क्या आप कृपया नीचे रखने के लिए कुछ स्पष्टीकरण जोड़ेंगे? (अपने समय के लिए धन्यवाद btw, बस चीजों की तह तक जाना चाहते हैं)
Tiberiu Craciun

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

@CodeCaster मेरे विशिष्ट मामले को समझने के बाद मैंने एक और संपादन किया था (मैंने पूरी पोस्ट बदल दी)। अपने अंतिम संपादन में मैंने सटीक स्थिति का संकेत दिया जब स्वीकार किए गए उत्तर बैकअप लिंक के साथ लागू नहीं होते हैं एक प्रासंगिक प्रश्न उसी व्यक्ति द्वारा उत्तर दिया गया है जो यह साबित करता है कि डिजाइन और बग नहीं है।
टीबिरियु क्रूसिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.