मैं 4 एमएक्स में आंशिक दृश्य के लिए मापदंडों को कैसे पारित कर सकता हूं


152

मेरा लिंक इस प्रकार है:

 <a href='Member/MemberHome/Profile/Id'><span>Profile</span></a>

और जब मैं इस पर क्लिक करता हूँ तो यह इस आंशिक पृष्ठ को कॉल करेगा:

 @{
    switch ((string)ViewBag.Details)
    {

        case "Profile":
        {
           @Html.Partial("_Profile"); break;
        }

    }
}

आंशिक पृष्ठ _ संक्षिप्त में शामिल हैं:

Html.Action("Action", "Controller", model.Paramter) 

उदाहरण:

@Html.Action("MemberProfile", "Member", new { id=1 })   // id is always changing

मेरा संदेह यह है कि मैं इस "आईडी" को मॉडल.परमीटर भाग में कैसे पारित कर सकता हूं ?

मेरे नियंत्रक हैं:

 public ActionResult MemberHome(string id)
    {
        ViewBag.Details = id;
        return View();
    }
  public ActionResult MemberProfile(int id = 0)
    {
        MemberData md = new Member().GetMemberProfile(id);
        return PartialView("_ProfilePage",md);
    }

2
मुझे नहीं मिला। शायद अगर आप अपने नियंत्रक और कार्रवाई को जोड़ते हैं, तो यह मदद कर सकता है, लेकिन जैसा कि अभी लिखा गया है, मैं आपके सवाल को नहीं समझता।
लियाम

msdn पर आंशिक विस्तार के बारे में देखें
ग्रुनडी

जवाबों:


346

आपके प्रश्न को समझना मुश्किल है, लेकिन अगर मैं समझ रहा हूं, तो आपके पास आपके मुख्य दृश्य में कुछ मूल्य हैं जो आप उस दृश्य में प्रदान किए जा रहे आंशिक रूप से एक्सेस करना चाहते हैं।

यदि आप सिर्फ आंशिक नाम के साथ एक आंशिक रेंडर करते हैं:

@Html.Partial("_SomePartial")

यह वास्तव में आपके मॉडल को एक निहित पैरामीटर के रूप में पारित करेगा, यदि आप कॉल करना चाहते हैं तो:

@Html.Partial("_SomePartial", Model)

अब, आपके आंशिक के लिए वास्तव में इसका उपयोग करने में सक्षम होने के लिए, हालांकि, इसके लिए एक परिभाषित मॉडल भी होना चाहिए, उदाहरण के लिए:

@model Namespace.To.Your.Model

@Html.Action("MemberProfile", "Member", new { id = Model.Id })

वैकल्पिक रूप से, यदि आप किसी ऐसे मान के साथ काम कर रहे हैं जो आपके दृश्य के मॉडल पर नहीं है (यह व्यूबाग में है या दृश्य में किसी भी तरह से उत्पन्न मान है, तो आप एक पास कर सकते हैं ViewDataDictionary

@Html.Partial("_SomePartial", new ViewDataDictionary { { "id", someInteger } });

और तब:

@Html.Action("MemberProfile", "Member", new { id = ViewData["id"] })

मॉडल के साथ, रेज़र आपके भाग ViewDataको डिफ़ॉल्ट रूप से आंशिक रूप से पास कर देगा , इसलिए यदि ViewBag.Idआपके विचार में यह था , तो आप अपने आंशिक में उसी चीज़ का संदर्भ दे सकते हैं।


4
यदि आप अपना मुख्य मॉडल इंटरफ़ेस लागू करते हैं, तो आप उस इंटरफ़ेस का आंशिक दृश्य मॉडल के रूप में उपयोग कर सकते हैं। तब आप इसका भरपूर उपयोग कर सकते हैं।
जेस

@ChrisPratt हमेशा की तरह बहुत ही स्पष्ट जवाब :) वोट +
मूरत Yıldız

6
मुझे इसके लिए @Html.Partial("_SomePartial", new Microsoft.AspNet.Mvc.ViewFeatures.ViewDataDictionary(this.ViewData) { { "id", someInteger } });काम करना था। मैं VS2015 DNX 4.5.1 का उपयोग कर रहा हूं अगर किसी और के पास भी यही मुद्दा है।
माइकटीवई

46

सबसे कम विधि में से एक, जिसे मैंने स्वयं के लिए खोजते समय एकल मूल्य के लिए पाया था, केवल सिंगल स्ट्रिंग और सेटिंग स्ट्रिंग को मॉडल के रूप में इस तरह से देख रहा है।

अपने आंशिक बुला पक्ष में

@Html.Partial("ParitalAction", "String data to pass to partial")

और फिर इस तरह से आंशिक दृश्य के साथ मॉडल को बांधना

@model string

और इस तरह से आंशिक दृश्य में इसके मूल्य का उपयोग करना

@Model

आप अन्य डेटाटाइप्स जैसे सरणी, इंट या अधिक जटिल डेटा प्रकार जैसे IDEDIA या कुछ और के साथ भी खेल सकते हैं।

आशा करता हूँ की ये काम करेगा,


4
यह साफ है! बिल्कुल वही जो मैं चाहता था। धन्यवाद।
गौतम जैन

मेरे आंशिक को मेरे मॉडल की आवश्यकता नहीं थी, लेकिन मुझे सभी ViewData ModelState सामान को संरक्षित करने की आवश्यकता थी .. यह चाल चली। मेरे आंशिक विचार में, मैं अभी भी ViewContext.ViewData.ModelState.ContainsKey (@ Model.ToString ())
da_jokker

यह NullReferenceExceptionएक वस्तु के उदाहरण के लिए सेट नहीं है, वस्तु संदर्भ फेंक रहा है , यह कह रहा है कि Modelअशक्त है। कोई विचार?
फेसपल्म

15

यहाँ एक विस्तार विधि है जो किसी ऑब्जेक्ट को ViewDataDictionary में परिवर्तित कर देगा।

public static ViewDataDictionary ToViewDataDictionary(this object values)
{
    var dictionary = new ViewDataDictionary();
    foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(values))
    {
        dictionary.Add(property.Name, property.GetValue(values));
    }
    return dictionary;
}

फिर आप इसे अपने विचार में उपयोग कर सकते हैं जैसे:

@Html.Partial("_MyPartial", new
{
    Property1 = "Value1",
    Property2 = "Value2"
}.ToViewDataDictionary())

जो new ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}वाक्य रचना की तुलना में बहुत अच्छा है ।

फिर अपने आंशिक दृश्य में, आप ViewBagअनुक्रमित गुणों के बजाय एक गतिशील ऑब्जेक्ट से गुणों को एक्सेस करने के लिए उपयोग कर सकते हैं , उदा

<p>@ViewBag.Property1</p>
<p>@ViewBag.Property2</p>

मुझे यह ToViewDataDictionaryस्थैतिक तरीका कहां रखना चाहिए ? हर जगह मैं इसे डालने की कोशिश करता हूं मुझे किसी प्रकार की संकलक त्रुटि मिलती है।
Csaba Toth

2
@CabaToth यह एक विस्तार विधि है। बस इसे एक स्थिर वर्ग में रखें और फिर उस वर्ग को अपने विचार में देखें।
क्रिस हेनस

3

Asp.Net कोर के लिए आप बेहतर उपयोग करते हैं

<partial name="_MyPartialView" model="MyModel" />

इसलिए उदाहरण के लिए

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.