2011-01-27 19 views
6

मेरे पास एक डिस्प्ले टेम्पलेट वाला एमवीसी पृष्ठ है। मैं displaytemplate में प्रस्तुत किए जा रहे वर्तमान आइटम की अनुक्रमणिका कैसे प्राप्त करूं? यह नाम विशेषताओं में सही बाध्यकारी परिणाम उत्पन्न करता है।एमवीसी डिस्प्ले टेम्पलेट में वर्तमान आइटम का इंडेक्स

<input name="xxx[0].FirstName"/> 
<input name="xxx[1].FirstName"/> 

मैं डिस्प्ले टेम्पलेट में इंडेक्स मान चाहता हूं। क्या यह कहीं भी ViewContext में है?

@ * page.cshtml @ @model ... @ संपत्ति संपर्क IEnumerable है * @

<table id="contacts" class="editable"> 
    <thead> 
    <tr><th>Name</th><th>Surname</th><th>Contact Details</th></tr> 
    </thead> 

    <tbody> 
    @Html.DisplayFor(x => x.Contacts) 
    </tbody> 
प्रदर्शन टेम्पलेट में

हम

@* contact.cshtml *@ 
@model [email protected]* This is the T of the IEnumerable<T> *@ 

<tr> 
    @* I NEED THE INDEX OF THE CURRENT ITERATION HERE *@ 
    <td>@Html.DisplayFor(x => x.FirstName)</td> 
</tr> 

उत्तर

12

है मुझे डर है कर रहा हूँ सूचकांक प्राप्त करने का कोई आसान तरीका नहीं है। इसे आंतरिक System.Web.Mvc.Html.DefaultDisplayTemplates.CollectionTemplate विधि के अंदर दफनाया गया है और इसका खुलासा नहीं किया गया है। क्या आप इस्तेमाल कर सकते हैं क्षेत्र उपसर्ग है:

@for (int i = 0; i < Model.Contacts.Length; i++) 
{ 
    @Html.DisplayFor(x => x.Contacts[i], new { Index = i }) 
} 

और फिर टेम्पलेट @ViewBag.Index अंदर आप वर्तमान सूचकांक देना चाहिए, लेकिन मैं यह थोड़े बदसूरत है स्वीकार करना होगा:

@ViewData.TemplateInfo.HtmlFieldPrefix 

एक और संभावना के साथ @Html.DisplayFor(x => x.Contacts) की जगह है।

+0

धन्यवाद, मैं इसे बाहर पार्स जाएगा उपसर्ग का। – Jim

+2

@ जिम, पार्सिंग से सावधान रहें क्योंकि आपके पास 'संपर्क [5] जैसे गहरे स्तर हो सकते हैं। एड्रेस [7] '। –

+0

टिप के लिए धन्यवाद, मैं इसे ध्यान में रखूंगा। दस साल पहले मैंने कुछ हफ्तों बिताए थे जो सबसे लचीला और सुरुचिपूर्ण मल्टी लेवल पार्सर लिखते थे। आज मैं अंतिम मिलान संख्या ले जाऊंगा और इसमें रहूंगा! – Jim

0

आपको इंडेक्स की आवश्यकता क्यों है, इस पर निर्भर करता है कि एक आसान तरीका हो सकता है।

मैं ऐसी ही कुछ कर रहा था और सूचकांक चाहता था सिर्फ इसलिए मैं आसानी से इस तरह के रूप आइटमों की सूची नंबर सकता है:

  1. सूची में पहले आइटम
  2. सूची आदि में
  3. दूसरा आइटम

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

<ol> 
    @Html.DisplayFor(m => m.Items) 
</ol> 

और मेरे टेम्पलेट divs का उपयोग कर एक सूची आइटम में वस्तुओं पर लिखा है:

तो मेरी माँ बाप देखे जाने के बाद किया था और प्रभाव

<li> 
    <div class="class1">@Html.DisplayFor(m => m.ItemType)</div> 
    ... 
</li> 

की तरह एक मेज सीएसएस:

.class1 { 
    display: inline-block; 
    width: 150px; 
} 
2

विस्तार @ DarinDimitrov के

Extention:

namespace ApplicationName.Helpers 
{ 
    public static class RazorHtmlHelpers 
    { 
     public static Int32 GetTemplateIndex(this TemplateInfo template) 
     { 
      var index = 0; 

      var match = Regex.Match(template.HtmlFieldPrefix, @"\d"); 
      Int32.TryParse(match.Value, out index); 

      return index; 
     } 
    } 
} 

जनक देखें मार्कअप: इस सवाल का जवाब है, मैं एक पूर्ण समाधान प्रस्तुत करने के लिए चाहता था

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

खाका मार्कअप:

@using ApplicationName.Helpers 
@model ApplicationName.Models.ModelName 

<span>Item @ViewData.TemplateInfo.GetTemplateIndex()</span>