मैंने सुना है कि एक दृश्य के अंदर @foreach होना कोई नहीं है। मतलब, दृश्य में कोई तर्क नहीं होना चाहिए। जहां पर @foreach के लिए तर्क होना चाहिए वहां सबसे अच्छा अभ्यास क्या है?
@foreach..
मैंने सुना है कि एक दृश्य के अंदर @foreach होना कोई नहीं है। मतलब, दृश्य में कोई तर्क नहीं होना चाहिए। जहां पर @foreach के लिए तर्क होना चाहिए वहां सबसे अच्छा अभ्यास क्या है?
@foreach..
जवाबों:
जहां पर @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>
स्पष्ट रूप से ठीक वही कन्वेंशन एडिटर टेम्प्लेट के लिए लागू होते हैं, जिनका उपयोग आपको उस मामले में किया जाना चाहिए, जिसमें आप कुछ इनपुट फ़ील्ड दिखाना चाहते हैं, जिससे आप केवल रीडोनली के रूप में प्रदर्शित करने के विपरीत व्यू मॉडल को संपादित कर सकें।
foreach
? बहुत कम से कम एक डिस्प्ले टेम्प्लेट (जबकि पूरी तरह स्वीकार्य दृष्टिकोण, परवाह किए बिना) को एक नए दृश्य को प्रस्तुत करने की आवश्यकता होती है, जो मुक्त नहीं है। समय का अधिकांश हिस्सा आपकी साइट के लोड समय को ध्यान से प्रभावित नहीं करेगा, लेकिन पर्याप्त रूप से करने पर, यह एक प्रदर्शन हिट हो सकता है। एक foreach
के आसपास एचटीएमएल का एक सा है और हमेशा लगभग तात्कालिक हो जाएगा। जैसा कि मैंने कहा, यह किसी भी तरह से बहुत बड़ी बात नहीं है, हालांकि, लेकिन अगर कुछ भी उपयोग करने के लिए कोई तर्क हैforeach
।
जब लोग कहते हैं कि विचारों में तर्क मत रखो, वे आमतौर पर व्यावसायिक तर्क की बात करते हैं, तर्क का प्रतिपादन नहीं करते। मेरी विनम्र राय में, मुझे लगता है कि विचारों में @foreach का उपयोग करना पूरी तरह से ठीक है।
मैं उपयोग कर रहा हूँ @foreach
जब मैं एक इकाई है कि (1 दृश्य में 2 ग्रिड प्रदर्शित करने के लिए उदाहरण के लिए) संस्थाओं की एक सूची है भेजने
उदाहरण के लिए यदि मैं मॉडल फू के रूप में संस्था को भेज रहा हूँ जिसमें शामिल है Foo1(List<Foo1>)
औरFoo2(List<Foo2>)
मैं पहली सूची के साथ उल्लेख कर सकते हैं:
@foreach (var item in Model.Foo.Foo1)
{
@Html.DisplayFor(modelItem=> item.fooName)
}
एक मामले के लिए @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>
Html.DropDownListFor
बस शीर्षक को ध्यान में रखेगा? यह तुच्छ है और स्पेगेटी कोड में आपके विचार नहीं बदलते हैं: stackoverflow.com/a/7938038/29407
optgroup
चुनिंदा सूची में तत्वों को प्रस्तुत करने के लिए इसका उपयोग कर रहा होगा , क्योंकि HtmlHelpers में इसके लिए कोई समर्थन नहीं है। यदि आपको केवल चयन सूची में एक अतिरिक्त आइटम जोड़ने की आवश्यकता है, तो इसे प्राप्त करने के बेहतर तरीके हैं और फिर भी सहायक का उपयोग करें।
टेम्पलेट को इंगित करने के लिए अधिभार का उपयोग करते समय उत्तर काम नहीं करेगा @Html.DisplayFor(x => x.Foos, "YourTemplateName)
।
लगता है कि इस तरह से डिजाइन किया गया है, इस मामले को देखें । इसके अलावा, जो फ्रेमवर्क अपवाद देता है (उस प्रकार के बारे में जैसा कि अपेक्षित नहीं था) काफी भ्रामक है और मुझे पहली कोशिश में बेवकूफ बनाया (धन्यवाद @CodeCaster)
इस मामले में आपको उपयोग करना होगा@foreach
@foreach (var item in Model.Foos)
{
@Html.DisplayFor(x => item, "FooTemplate")
}
IEnumerable<T>
टेम्पलेट को टाइप करेगा और कॉल करेगा T
।