2012-05-03 8 views
6

एप्लिकेशन रेजर व्यू इंजन के साथ एक एमवीसी 3 एप्लीकेशन है।क्यों RazorViewEngine मेरा डिस्प्ले टेम्पलेट नहीं उठाता है?

यहां उपयोग किया जाने वाला नियंत्रक टेस्टकंट्रोलर है। मैं नेस्टेड दृश्यों का उपयोग कर रहा हूं।

बेस दृश्य (आइटम लिस्टिंग) इस प्रकार है,

//Listing.cshtml 
@model ItemsList 
@for (int i = 0; i < Model.Items.Count(); i++) 
    { 
     @Html.DisplayFor(x => x.Items[i], new { RowPosition = i}) 
} 
यहाँ

आइटम

//Item.cshtml 
@model Item 
@Html.DisplayFor(x=>x.HeaderText) 
@Html.DisplayFor(x=>x, "ItemDetails") 

के लिए टेम्पलेट यहाँ

//ItemDetails.cshtml 
@model Item 
@Html.DisplayFor(x=>x.Description) 

तो है और आइटम के लिए दृश्य है विवरण

, मैं आईटीईएम टेम्पलेट से ITEMDETAILS टेम्पलेट में मॉडल को आगे बढ़ाने की कोशिश कर रहा हूं। ItemDetails.cshtml "दृश्य \ परीक्षण \ प्रदर्शन टेम्पलेट्स" के अंतर्गत रखा गया है। असल में मैंने इसे "दृश्य \ साझा" के साथ-साथ "दृश्य \ साझा \ डिस्प्ले टेम्पलेट" फ़ोल्डर के नीचे रखने का प्रयास किया है। लेकिन देखो इंजन बस इसे लेने के लिए नहीं लगता है।

हालांकि माइक्रोसॉफ्ट प्रलेखन here बताता है कि इंजन देखें टेम्पलेट नाम का उपयोग करके दृश्य लाने के लिए नियंत्रक \ DisplayTemplates फ़ोल्डर में देखता है।

+1

यह संभवतः एक बग नहीं है। कृपया एक और उपयोगी/प्रासंगिक शीर्षक लिखें। –

+2

टॉम, मेरा सवाल यह है कि क्यों इंजन इंजन दृश्य नहीं उठा रहा है। ItemDetails के लिए डिस्प्ले बस खाली दिखाता है। कोई अपवाद नहीं। मैं कैसे डिबग कर सकता हूं कि दृश्य इंजन दृश्यों के पीछे कैसे काम कर रहा है? – EagerToLearn

+1

किसी अच्छे झपकी की शक्ति को कभी कम मत समझें –

उत्तर

5

यह प्रतीत होता है का उपयोग करते हुए इस तरह के (Item.cshtml में) कर के रूप में, कस्टम प्रदर्शन टेम्पलेट्स में आकस्मिक अनंत प्रत्यावर्तन को रोकने के लिए, प्रदर्शन/EditorTemplates लिए करना व्यवहार होने के लिए शायद का प्रयास करें:

@model Item 
@Html.DisplayFor(x => x) 

। .. जो असीमित रूप से Item.cshtml डिस्प्ले टेम्पलेट प्रदर्शित करेगा।

स्पष्ट रूप से आपके उदाहरण में आप आइटम/मॉडल को अलग-अलग टेम्पलेट में पास कर रहे हैं, इसलिए यह अनंत रिकर्सन नहीं करेगा। हालांकि, यह अभी भी ढांचे में एक ही सुरक्षित गार्ड द्वारा पकड़ा गया प्रतीत होता है। वास्तव में यह सुनिश्चित नहीं है कि इसे 'बग' या सिर्फ 'डिज़ाइन' के रूप में वर्गीकृत किया जाएगा?

// Normally this shouldn't happen, unless someone writes their own custom Object templates which 
// don't check to make sure that the object hasn't already been displayed 
object visitedObjectsKey = metadata.Model ?? metadata.RealModelType; 
if (html.ViewDataContainer.ViewData.TemplateInfo.VisitedObjects.Contains(visitedObjectsKey)) { // DDB #224750 
    return String.Empty; 
} 

ViewData.TemplateInfo.VisitedObjects दुकानों का दौरा किया वस्तुओं/माता-पिता टेम्पलेट्स के लिए मॉडल:

यह DisplayFor/TemplateFor helper में जांच है। जब आप चलाएँ:

@Html.DisplayFor(x => x.Items[i], new { RowPosition = i}) 

यह अपने Item.cshtml DisplayTemplate renders और VisitedObjects के लिए आइटम/मॉडल कहते हैं।इसका मतलब यह है जब Item.cshtml की कोशिश करता एक ही आइटम/मॉडल के साथ एक और बच्चा टेम्पलेट प्रदर्शित करने के लिए:

@Html.DisplayFor(x => x, "ItemDetails") 

आइटम/मॉडल VisitedObjects में पहले से ही है, इसलिए अगर बयान से ऊपर सच के बजाय यह ItemDetails.cshtml प्रतिपादन के यह सिर्फ चुपचाप रिटर्न/एक खाली स्ट्रिंग प्रस्तुत करता है।

+0

की परिभाषा की आवश्यकता है, मुझे हाल ही में इस "फीचर" का सामना करना पड़ा और इससे मुझे कर्कश का कोई अंत नहीं हुआ। मुझे लगता है कि एमवीसी टीम ने यहां गलती की है। एक खाली स्ट्रिंग लौटने से डेवलपर को इंप्रेशन मिलता है कि जब तक वे आउटपुट नहीं देखते हैं, तब तक सब ठीक हो जाता है। यह यह पता लगाने के लिए असंभव है कि _IS_ क्या हो रहा है। कम से कम कोड एक अपवाद फेंक सकता है, व्यवहार को स्पष्टीकरण प्रदान कर सकता है और इस मुद्दे पर डेवलपर को सतर्क कर सकता है। –

1

सबसे पहले, लूप के लिए उपयोग न करें। प्रदर्शन/संपादक टेम्पलेट संग्रह को संभालने में सक्षम हैं।

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

इसके अलावा, आपके DisplayFor() मुख्य दृश्य में गलत है का उपयोग कर के लिए कनवर्ट फिर आप एक ItemsList.cshtml या बस एक Item.cshtml होगा। आप इस तरह से DisplayTemplates में एचटीएमएल विशेषताओं को पारित नहीं कर सकते हैं।

0

@Html.RenderPartial("ItemDetails", item)

संबंधित मुद्दे