एक मजबूत-टाइप किए गए आंशिक दृश्य के लिए अतिरिक्त ViewData पास करें


174

मेरे पास एक दृढ़ता से टाइप किया गया आंशिक दृश्य है जो एक ProductImage लेता है और जब यह प्रदान किया जाता है तो मैं इसे कुछ अतिरिक्त ViewData के साथ भी प्रदान करना चाहूंगा जो मैं पृष्ठ में गतिशील रूप से बनाता हूं। मैं रेंडरपार्टियल कॉल के साथ आंशिक दृश्य के लिए अपनी दृढ़ता से टाइप की गई वस्तु और अपने कस्टम व्यूडेट दोनों को कैसे पास कर सकता हूं?

var index = 0;
foreach (var image in Model.Images.OrderBy(p => p.Order))
{
  Html.RenderPartial("ProductImageForm", image); // < Pass 'index' to partial
  index++;
}

जवाबों:


251

RenderPartial एक अन्य पैरामीटर लेता है जो कि बस एक ViewDataDictionary है। आप लगभग वहाँ हैं, बस इसे इस तरह से कॉल करें:

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary { { "index", index } }
); 

ध्यान दें कि यह डिफ़ॉल्ट ViewData को ओवरराइड करेगा कि आपके सभी अन्य दृश्य डिफ़ॉल्ट रूप से हैं। यदि आप ViewData में कुछ भी जोड़ रहे हैं, तो यह इस नए शब्दकोश में नहीं होगा जो आप अपने आंशिक दृश्य में पास कर रहे हैं।


2
मैं यह करने की कोशिश कर रहा हूं और यह लौट रहा है "शून्य को ऑब्जेक्ट में नहीं बदल सकता"।
प्रोग्राम

4
@programad @ Html.RenderPartial () से @ को हटाने का प्रयास करें, यह मेरे लिए उस समस्या को ठीक करता है, लेकिन मैं एक @ {} कोड ब्लॉक के भीतर एक लाइन पर RenderPartial () को कॉल कर रहा था।
danjarvis

5
मैं नीचे ctorx के उत्तर की जांच करने की सलाह देता हूं। वह मौजूदा ViewData में अतिरिक्त डेटा जोड़ता है।
रा ० रा ० २४'१६

162

पोस्ट किए गए किस अपघटन का विस्तार करने के लिए, आप मौजूदा व्यू डेटा को बनाए रखते हुए नया व्यू डाटा पास कर सकते हैं यदि आप इस ViewDataDictionaryतरह के कंस्ट्रक्टर ओवरलोड का उपयोग करते हैं :

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       new ViewDataDictionary(this.ViewData) { { "index", index } }
); 

3
यह बहुत उपयोगी हो सकता है यदि आपको TemplateInfo.HtmlFieldPrefixबच्चे के नियंत्रण में बनाए रखने की आवश्यकता होती है जो अन्यथा रीसेट हो जाएगा
शमौन_वेअर

12
यह निश्चित रूप से बेहतर समाधान है। ViewData को खोने का मतलब है कि आप ModelState और सभी सत्यापन खो देते हैं। +1
केविन फारुगिया

यह केवल तभी काम करता है जब आप अपने ViewDataDictionary में एक TemplateInfo.HtmlFieldPrefix पास नहीं करते हैं। मैं केवल उत्तर पर ilustrated के रूप में एक चर पास कर सकता हूं, या एक TemplateInfo.HtmlFieldPrefix नहीं बल्कि दोनों को पास कर सकता हूं।
फॉक्स

45
@Html.Partial("_Header", new ViewDataDictionary { { "HeaderName", "User Management" }, { "TitleName", "List Of Users" } })
or
@{Html.RenderPartial("_Header", new ViewDataDictionary { { "HeaderName", "User Management" }, { "TitleName", "List Of Users" } });}

आंशिक पृष्ठ (_Header):

<div class="row titleBlock">
    <h1>@ViewData["HeaderName"].ToString()</h1>
    <h5>@ViewData["TitleName"].ToString()</h5>
</div>

2
यह सबसे पूर्ण उत्तर की तरह लगता है (हालांकि .ToString () अनावश्यक है)।
कॉलिन

9

मुझे लगता है कि यह काम नहीं करना चाहिए?

ViewData["currentIndex"] = index;

6
हालांकि यह ऐसा करने का एक बहुत मजबूत तरीका नहीं है, इसने मुझे यह पता लगाने में मदद की कि कैसे वॉम्प के जवाब से एक डेटा डेटा पुनः प्राप्त किया जाए।
मथियास लिकेगार्ड लोरेनजेन

6

एक और वर्ग बनाएँ जिसमें आपका जोरदार टाइप किया हुआ वर्ग हो।

अपने नए सामान को कक्षा में जोड़ें और इसे दृश्य में वापस करें।

फिर दृश्य में, आप अपने नए वर्ग को इनहेरिट करना सुनिश्चित करें और कोड के बिट्स को बदल दें जो अब त्रुटि में होंगे। अपने क्षेत्रों के संदर्भ।

उम्मीद है की यह मदद करेगा। यदि नहीं तो मुझे बताएं और मैं विशिष्ट कोड पोस्ट करूंगा।


4

अतिरिक्त डेटा पास करने का सबसे आसान तरीका है, डेटा को मौजूदा ViewData में @Joel मार्टिनेज नोटों के रूप में देखने के लिए जोड़ना। हालाँकि, यदि आप अपने ViewData को प्रदूषित नहीं करना चाहते हैं, तो RenderPartial में एक विधि है जो आपके द्वारा दिखाए जाने वाले दो-तर्क संस्करण के साथ-साथ तीन तर्क भी लेती है। तीसरा तर्क एक ViewDataDictionary है। आप अपने आंशिक भाग के लिए एक अलग ViewDataDictionary का निर्माण कर सकते हैं जिसमें आप केवल अतिरिक्त डेटा शामिल करना चाहते हैं।


1

यह भी काम करना चाहिए।

this.ViewData.Add("index", index);

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       this.ViewData
); 

धन्यवाद! यह वास्तव में तब उपयोगी होता है जब आप बाल भाग आदि के लिए ViewData डिक्शनरी का विस्तार कर रहे होते हैं
विकासशील

1

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

@{
Layout = null;
ViewData["SampleString"] = "some string need in the partial";
}

<partial name="_Partial" for="PartialViewModel" view-data="ViewData" />

0

आप गतिशील चर ViewBag का उपयोग कर सकते हैं

ViewBag.AnotherValue = valueToView;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.