डिक्शनरी में पास किया गया मॉडल आइटम प्रकार का है .. लेकिन इस शब्दकोश में टाइप के मॉडल आइटम की आवश्यकता होती है


87

इस सवाल और सामुदायिक विकी उत्तर को इस मेटा पोस्ट में चर्चित कई अनुत्तरित प्रश्नों को बंद करने में सहायता के लिए जोड़ा गया है ।


मेरे पास कुछ कोड है और जब यह निष्पादित होता है, तो यह एक अपवाद कहता है:

डिक्शनरी में दिया गया मॉडल आइटम प्रकार बार का है, लेकिन इस शब्दकोश में Foo प्रकार के मॉडल आइटम की आवश्यकता होती है

इसका क्या मतलब है, और मैं इसे कैसे ठीक करूं?


1
का उपयोग करते समय मैं यह त्रुटि आई return Viewबजाय return PartialViewइतना है कि बस की जांच करने के लिए चलो कुछ
रिचर्ड Housham

जवाबों:


94

त्रुटि का मतलब है कि आप उस दृश्य पर नेविगेट कर रहे हैं जिसका मॉडल टाइपोफ़ Foo(उपयोग करके @model Foo) घोषित किया गया है , लेकिन आपने वास्तव में इसे एक मॉडल दिया है जो टाइपोफ़ है Bar(शब्द शब्दकोश का उपयोग किया जाता है क्योंकि एक मॉडल दृश्य के माध्यम से पास किया जाता है ViewDataDictionary) ।

त्रुटि के कारण हो सकता है

नियंत्रक विधि से दृश्य (या आंशिक दृश्य) में गलत मॉडल पास करना

सामान्य उदाहरणों में एक क्वेरी का उपयोग करना शामिल है जो एक अनाम वस्तु (या अनाम वस्तुओं का संग्रह) बनाता है और इसे दृश्य में पास करता है

var model = db.Foos.Select(x => new
{
    ID = x.ID,
    Name = x.Name
};
return View(model); // passes an anonymous object to a view declared with @model Foo

या किसी ऐसे ऑब्जेक्ट को देखने के लिए ऑब्जेक्ट का संग्रह पास करना जो किसी एकल ऑब्जेक्ट की अपेक्षा करता है

var model = db.Foos.Where(x => x.ID == id);
return View(model); // passes IEnumerable<Foo> to a view declared with @model Foo

त्रुटि को आसानी से संकलन समय में उपयोग करने के बजाय दृश्य में मॉडल से मिलान करने के लिए नियंत्रक में मॉडल प्रकार की घोषणा करके पहचाना जा सकता है var

गलत मॉडल को एक दृश्य से आंशिक दृश्य में पास करना

निम्नलिखित मॉडल को देखते हुए

public class Foo
{
    public Bar MyBar { get; set; }
}

और तब के @model Fooसाथ घोषित एक मुख्य दृश्य और एक आंशिक दृश्य के साथ घोषित किया गया@model Bar

Foo model = db.Foos.Where(x => x.ID == id).Include(x => x.Bar).FirstOrDefault();
return View(model);

मुख्य दृश्य में सही मॉडल लौटाएगा। हालाँकि यदि दृश्य शामिल है तो अपवाद को फेंक दिया जाएगा

@Html.Partial("_Bar") // or @{ Html.RenderPartial("_Bar"); }

डिफ़ॉल्ट रूप से, आंशिक दृश्य में पास किया गया मॉडल मुख्य दृश्य में घोषित मॉडल है और आपको इसका उपयोग करने की आवश्यकता है

@Html.Partial("_Bar", Model.MyBar) // or @{ Html.RenderPartial("_Bar", Model.MyBar); }

Barआंशिक दृश्य के उदाहरण को पास करने के लिए । यह भी ध्यान दें कि यदि मान MyBarहै null(आरंभिक नहीं किया गया है), तो डिफ़ॉल्ट रूप Fooसे आंशिक रूप से पारित हो जाएगा, इस स्थिति में, यह होना चाहिए

@Html.Partial("_Bar", new Bar())

एक लेआउट में एक मॉडल की घोषणा

यदि एक लेआउट फ़ाइल में एक मॉडल घोषणा शामिल है, तो उस लेआउट का उपयोग करने वाले सभी विचारों को उसी मॉडल, या उस मॉडल को प्राप्त करने वाले मॉडल को घोषित करना होगा।

यदि आप एक लेआउट में एक अलग मॉडल के लिए HTML को शामिल करना चाहते हैं, तो लेआउट में, @Html.Action(...)एक [ChildActionOnly]विधि को कॉल करने के लिए उस मॉडल को इनिशियलाइज़ करता है और इसके लिए एक आंशिक दृश्य देता है।


27
+1 के लिए "यह भी नोट करें कि यदि MyBar का मान शून्य है (आरंभिक नहीं किया गया है), तो डिफ़ॉल्ट रूप से फू को आंशिक रूप से पास कर दिया जाएगा, जिस स्थिति में यह करने की आवश्यकता है"। बहुत महत्वपूर्ण नोट।
स्मिक्स

मुझे लेआउट के भीतर आंशिक दृश्य होने से वही त्रुटि मिल रही है, जिसमें कोई मॉडल प्रकार परिभाषित नहीं है। आंशिक दृश्य क्रैश हो जाता है क्योंकि यह इंडेक्स पेज से मॉडल प्राप्त करता है जब कोई भी परिभाषित नहीं होता है और न ही आवश्यकता होती है, और यदि मैं आंशिक मॉडल को IndexModel पर सेट करता हूं, तो ViewData गुण शून्य है !? इस परिदृश्य को कैसे ठीक करें? आंशिक को लेआउट में ले जाने से काम चल जाता है लेकिन मैं समझना चाहता हूं कि यह कैसे काम करता है।
एटीन चारलैंड

मैं उसी त्रुटि में भाग गया जब मेरे आंशिक दृश्य में "@model" के बिना शीर्ष पर "पृष्ठ" था। "पेज" को हटाने से समस्या हल हो गई।
इकाॅनडिली

1
यदि आप जानबूझकर अशक्त होने पर आंशिक रूप से अशक्त मॉडल भेजना चाहते हैं Model.MyBar, तो आप ऐसा कर सकते हैं: @Html.Partial("_Bar", Model.MyBar, new System.Web.Mvc.ViewDataDictionary()) स्रोत: https://stackoverflow.com/a/713921/4888725
Kirk Grover

@Smix यह एक बहुत ही उपयोगी टिप्पणी है। बस इसी में भाग गया।
contactmatt

7

इस सवाल का पहले से ही एक शानदार जवाब है, लेकिन मैं एक ही त्रुटि में, एक अलग परिदृश्य में भाग गया: Listएक EditorTemplate में प्रदर्शित करना

मेरे पास एक मॉडल है:

public class Foo
{
    public string FooName { get; set; }
    public List<Bar> Bars { get; set; }
}

public class Bar
{
    public string BarName { get; set; }
}

और यह मेरा मुख्य विचार है :

@model Foo

@Html.TextBoxFor(m => m.Name, new { @class = "form-control" })  
@Html.EditorFor(m => m.Bars)

और यह मेरा Bar EditorTemplate ( Bar.cshtml ) है

@model List<Bar>

<div class="some-style">
    @foreach (var item in Model)
    {
        <label>@item.BarName</label>
    }
</div>

और मुझे यह त्रुटि मिली:

डिक्शनरी में दिया गया मॉडल आइटम प्रकार 'बार' का है, लेकिन इस शब्दकोश में 'System.Collections.Generic.List`1 [Bar] के मॉडल आइटम की आवश्यकता होती है


इस त्रुटि का कारण यह है कि EditorForपहले से ही यह आपके Listलिए पुनरावृत्त करता है, इसलिए यदि आप इसके लिए एक संग्रह पास करते हैं, तो यह संग्रह में प्रत्येक आइटम के लिए एक बार संपादक टेम्पलेट प्रदर्शित करेगा।

इस तरह मैंने इस समस्या को ठीक किया:

संपादक टेम्पलेट के बाहर और मुख्य दृश्य में शैलियों को लाया :

@model Foo

@Html.TextBoxFor(m => m.Name, new { @class = "form-control" })  
<div class="some-style">
    @Html.EditorFor(m => m.Bars)
</div>

और EditorTemplate ( Bar.cshtml ) को इसमें बदल दिया :

@model Bar

<label>@Model.BarName</label>

1
बहुत बढ़िया, आपने सिर्फ आधे घंटे के बाद मेरे सिर को खरोंच कर मुझे बचा लिया। ASP.NET Core 3.1 MVC के लिए भी काम करता है।
ऊव कीम

6

निरीक्षण करें कि क्या दृश्य में मॉडल आवश्यक है:

राय

@model IEnumerable<WFAccess.Models.ViewModels.SiteViewModel>

<div class="row">
    <table class="table table-striped table-hover table-width-custom">
        <thead>
            <tr>
....

नियंत्रक

[HttpGet]
public ActionResult ListItems()
{
    SiteStore site = new SiteStore();
    site.GetSites();

    IEnumerable<SiteViewModel> sites =
        site.SitesList.Select(s => new SiteViewModel
        {
            Id = s.Id,
            Type = s.Type
        });

    return PartialView("_ListItems", sites);
}

मेरे मामले में मैं एक आंशिक दृश्य का उपयोग करता हूं, लेकिन सामान्य विचारों में चलता है


1
प्रश्न से इसका क्या लेना-देना है?

2
@StephenMuecke इस चैमप्स - डिक्शनरी में पास किया गया मॉडल आइटम प्रकार बार का है, लेकिन इस डिक्शनरी में Foo
CelzioBR
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.