12

नामकरण मैं DisplayTemplates और MVC 2.asp.net MVC के DisplayTemplates और EditorTemplate सम्मेलन

में EditorTemplates के लिए नामकरण परंपरा के बारे में सवालों की एक जोड़ी मिल गया है, उदाहरण के लिए मैं का एक बच्चा सूची के साथ एक ग्राहक वस्तु है, तो खाता मैं कैसे कर सकता हूं:

  • खातों की सूची के लिए एक प्रदर्शन टेम्पलेट बनाएं, फ़ाइल क्या कहा जाता है?

  • जब मैं foreach(var c in Model.Accounts) कर रहा हूं तो मैं फ़ोरैच लूप में डिस्प्ले मंदिर कैसे कॉल करूं? जब मैं Html.DisplayFor(x => x) फोरैच x के अंदर करता हूं तो मॉडल है और इस मामले में c नहीं है।

अग्रिम धन्यवाद।

उत्तर

13

हाँ, यह मेरी पसंदीदा विशेषताओं में से एक है, लेकिन यह कुछ चीजों के लिए थोड़ा उलझन में है।

तो, किसी भी वर्ग के लिए टेम्पलेट बनाना, नाम टाइप की नाम संपत्ति पर आधारित है, उदाहरण के लिए यदि आप <% = model.GetType()। नाम%> अपने दृश्य में, आप देख सकते हैं कि क्या मेरा मतलब। उदाहरण के तौर पर, यदि आपकी खातों की सूची एक आईएलआईस्ट है, तो कॉल पर नाम पर कॉल List`1 लौटाएगा। यह एक कानूनी फ़ाइल नाम है, इसलिए यदि आप अपने प्रदर्शन टेम्पलेट फ़ोल्डर में List`1.ascx डालते हैं, तो उसे यह मिल जाएगा और इसका उपयोग किया जाएगा। जो मैं बता सकता हूं, वह वर्ग पदानुक्रम को पार नहीं करेगा, उदाहरण के लिए, यदि आप वहां एक आईनेमेरेबल '1.ascx फ़ाइल डालते हैं, तो उसे यह नहीं मिलेगा।

एक पाश में प्रदर्शित करने के लिए, आप, लैम्ब्डा में आइटम चर में पारित करने के लिए की जरूरत है अपने उदाहरण में इतना:

<% foreach (var c in Accounts){ %> 
     <li><%= Html.DisplayFor(x => c) %></li> 
<%}%> 

आशा है कि मदद करता है। पॉल

+0

उत्तर के लिए धन्यवाद शानदार काम करता है। सिर्फ एक और सवाल अगर मेरे पास अलग-अलग बाल सूचियों के साथ दो अलग-अलग वस्तुएं हैं, तो खाते और लोगों दोनों के पास ऑब्जेक्ट का नाम होगा '1' आप दोनों के बीच अंतर कैसे करते हैं? या क्या आपको UIHint विशेषताओं का उपयोग करना है? – lancscoder

+0

हाँ, दोनों एक ही होंगे।मुझे लगता है कि UIHint काम करेगा (कोशिश नहीं की है) लेकिन आप यह भी कर सकते हैं कि सूची टेम्पलेट जेनेरिक हो (कहें, आईनेमरेबल, गैर-जेनेरिक पर आधारित) और उसके बाद इसे * इसकी * सूची के अंदर DisplayFor पर कॉल करें और फिर सूची आइटम प्रत्येक में उनके उचित टाइप किए गए टेम्पलेट होंगे। आप भी, iirc, ओवरलोड में से किसी एक स्ट्रिंग के रूप में एक स्पष्ट टेम्पलेट नाम में पास कर सकते हैं। – Paul

+0

(मार्कडाउन सिंटैक्स में शाब्दिक बैकटिक को ठीक करने के लिए संपादित किया गया।) –

11

ब्रैड विल्सन ब्लॉग http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html में कस्टम ऑब्जेक्ट्स के लिए डिस्प्ले टेम्पलेट्स और संपादक टेम्पलेट्स के बारे में एक उदाहरण है, और यह उन मुद्दों पर चर्चा करता है जो आपके प्रश्न को हल करने में सहायक हो सकते हैं।

आपके पहले प्रश्न के संबंध में, यह महत्वपूर्ण है कि आपका टेम्पलेट उस फ़ोल्डर में रहता है जिसमें सिस्टम मिलान करने वाले नामों की तलाश करता है, उदा।

~/Views/ControllerName/DisplayTemplates/TemplateName.aspx & .ascx 
~/Views/Shared/DisplayTemplates/TemplateName.aspx & .ascx 

(खोज संपादक टेम्पलेट्स के लिए पथ के लिए EditorTemplates साथ DisplayTemplates बदलें।)

निम्नलिखित टेम्पलेट के नाम क्रम में आज़माया: ModelMetadata से ModelMetadata

  • DataTypeName से

    • TemplateHint
    • प्रकार का नाम (नीचे नोट देखें)
    • तो वस्तु जटिल नहीं है: "स्ट्रिंग"
    • तो वस्तु जटिल है और एक अंतरफलक: "ऑब्जेक्ट"
    • तो वस्तु जटिल है और नहीं एक अंतरफलक: recurse प्रकार के लिए विरासत hiearchy के माध्यम से, हर कोशिश कर रहा टाइप करें

    मुझे आपके दूसरे प्रश्न के उत्तर के बारे में निश्चित नहीं है। क्या यह मानना ​​सही है कि var c वास्तव में प्रभावी ढंग से खाता सी है? और जब आप Html.DisplayFor(x => x) लिख रहे हैं तो आप Html.DisplayModelFor(c => c) लिख सकते हैं? या आप उदाहरण के लिए 'Html.DisplayFor (x => x.AccountName) चाहते हैं?

  • +0

    हाय, लिंक यह काफी हालांकि मेरे सभी सवालों के जवाब नहीं है के लिए धन्यवाद। उदाहरण के लिए कहें कि मेरे पास ऑर्डर की बाल सूची वाला ग्राहक है। फिलहाल अगर मैं ऑर्डर की सूची दिखाना चाहता हूं तो मैंने आईनंबरबल का आंशिक दृश्य बनाया है और प्रत्येक ऑब्जेक्ट के चारों ओर एक टेबल बनाने के लिए लूप बनाया है। अगर मैं इसका उपयोग करना चाहता था तो मैं कुछ लिंक एचटीएमएल। रेंडरपार्टियल ("ऑर्डर्सटेबल", मॉडल.ऑर्डर) कहूंगा लेकिन इसका उपयोग करने के बजाय मैं एचटीएमएल.डिस्प्लेफोर (x => x.Orders) कहना चाहूंगा और यह एक डिस्प्ले टेम्पलेट पाता है लेकिन मुझे नहीं पता कि सूची के लिए डिस्प्ले टेम्पलेट को क्या कॉल करना है। – lancscoder

    +1

    मैं थोड़ी देर के लिए इस के खिलाफ अपने सिर को टक्कर लगी हूं। मुझे एहसास नहीं हुआ कि खोज पथ महत्वपूर्ण थे। यह स्पष्ट करने के लिए आपकी पोस्ट संपादित करेगा। –

    13

    मुझे पता है इस सवाल का एक सा पुराना है, लेकिन कम से कम MVC 3 में आप एक सूची आप टेम्पलेट के नाम पर पारित कर सकते हैं का उपयोग कर एक कस्टम प्रदर्शन/संपादन टेम्पलेट करना चाहते हैं जब:

    Html.DisplayFor(model => model.Account, "AccountList") 
    

    तो आपके टेम्पलेट का नाम "खातासूची" होगा।

    +1

    स्वीकार्य उत्तर से काफी बेहतर है। स्पष्ट रूप से जवाब देने के समय यह प्रासंगिक था लेकिन एसओ का बिंदु पुराने उत्तरों को अपडेट कर रहा है या आपके जैसे नए उत्तरों को ऊपर उठा सकता है। धन्यवाद। – ppumkin

    1

    एक एमवीसी 3 अनुप्रयोग स्थापित करते समय, विदेशी कुंजी जो किसी आइटम का चयन करने के लिए ड्रॉप डाउन सूचियों को छोड़ने की अनुमति देनी चाहिए, ड्रॉप डाउन के रूप में प्रस्तुत नहीं की जाती है, बल्कि स्थिर इनपुट के रूप में। इसे कस्टम डिस्प्ले बनाकर और उस फ़ील्ड के लिए देखकर हल किया जा सकता है। हमें एक कस्टम आंशिक दृश्य बनाकर शुरू करना होगा जो "~/Views/Shared/displayTemplates/UserGuid.cshtml", और "~/Views/Shared/EditTemplates/UserGuid.cshtml" में रहेंगे। एक के लिए कोड के नीचे है:

    @model Guid 
    
    @{ 
        incMvcSite.Models.MvcSiteDB db = new incMvcSite.Models.MvcSiteDB(); 
        incMvcSite.Models.SecUser usr = db.SecUsers.Single(u => u.Guid == Model); 
    } 
    @usr.Display 
    

    यह है कि संदर्भित तालिका में आइटम को देखने और यह प्रदर्शित करेगा टेम्पलेट के लिए एक प्रदर्शन है। हमें निम्नानुसार टेम्पलेट के लिए एक संपादन की भी आवश्यकता है:

    @model Guid 
    @{ 
        incMvcSite.Models.MvcSiteDB db = new incMvcSite.Models.MvcSiteDB(); 
        SelectList items = new SelectList(db.SecUsers.OrderBy(i => i.Display).ToList(), "Guid", "Display", Model); 
    } 
    @Html.DropDownList("", items) 
    

    टेम्पलेट के लिए संपादन ड्रॉप डाउन सूची के रूप में लागू किया गया है। मूल रूप से, हमने स्थिर HTML कोड का उपयोग किया है, लेकिन समस्या "उपसर्ग" को लागू करने के लिए दिखाई देगी। स्टेटिक एचटीएमएल कोड एचटीएमएल हेल्पर्स द्वारा संभाला जाता है, इसलिए यह अनुशंसा की जाती है कि आप HTML.DropDownList() का उपयोग करें। नए प्रदर्शन और संपादित टेम्पलेट्स के लिए उपयोग करने के लिए MVC ढांचे के लिए मजबूर करने के लिए, हम अपने मॉडल आइटम annote एक निम्न पंक्ति जोड़ने की जरूरत: [UIHint ("UserGuid")]

    यह MVC प्रदर्शन का उपयोग करने के कारण होगा और "UserGuid" नामक टेम्पलेट्स संपादित करें, जो केवल आंशिक विचार हैं।

    -1

    पिछले संस्करणों में सुनिश्चित नहीं हैं लेकिन MVC5 में आप जो कस्टम प्रदर्शन/संपादक टेम्पलेट तो जैसे मॉडल में उपयोग करने के लिए निर्दिष्ट करने के लिए UIHint उपयोग कर सकते हैं,

    [UIHint ("CustomAccountList")] सार्वजनिक सूची लेखा {मिल ; सेट; }

    या तो

    Html.DisplayFor की तरह ध्यान में रखते हुए (मॉडल => model.Accounts, "CustomAccountList")