অভিধানে পাস করা মডেল আইটেমটি টাইপযুক্ত .. তবে এই অভিধানে একটি মডেল আইটেমের প্রয়োজন


87

এই প্রশ্ন এবং সম্প্রদায় উইকির উত্তরটি এই মেটা পোস্টে আলোচিত অসংখ্য উত্তরহীন প্রশ্নগুলি বন্ধ করতে সহায়তা করার জন্য যুক্ত করা হয়েছে ।


আমার কিছু কোড রয়েছে এবং যখন এটি কার্যকর হয়, তখন এটি একটি ব্যতিক্রম বলে:

অভিধানে পাস করা মডেল আইটেমটি বার টাইপের হলেও এই অভিধানটির জন্য ফু টাইপের একটি মডেল আইটেম প্রয়োজন

এর অর্থ কী এবং আমি কীভাবে এটি ঠিক করব?


4
return Viewপরিবর্তে এটি ব্যবহার করার সময় আমি এই ত্রুটিটি পেয়েছি return PartialViewযাতে এটি কেবল যাচাই করার জন্য
রিচার্ড হুশাম

উত্তর:


94

ত্রুটি অর্থ আপনি একজন দৃশ্য যার মডেল typeof হিসেবে ঘোষণা করা হয় নেভিগেট করছি Foo(ব্যবহার করে @model Foo), কিন্তু আপনি আসলে এটা একটি মডেল যা typeof হয় পাস 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.Action(...)কোনও [ChildActionOnly]পদ্ধতিটি কল করার জন্য সেই মডেলটি আরম্ভ করে এবং এর জন্য একটি আংশিক দৃষ্টিভঙ্গি প্রদান করে।


27
"1 এর জন্য এটি নোট করুন যে মাইবারের মানটি যদি শূন্য হয় (আরম্ভ করা হয়নি), তবে ডিফল্টরূপে ফু আংশিক হয়ে যাবে, সেই ক্ষেত্রে এটি হওয়া দরকার"। খুব গুরুত্বপূর্ণ নোট।
স্মিক্স

কোনও বিন্যাস সংজ্ঞায়িত না করে একটি বিন্যাসের মধ্যে আংশিক দৃশ্য রেখে আমি একই ত্রুটিটি পাচ্ছি getting আংশিক ভিউ ক্র্যাশ হয়ে গেছে কারণ এটি সূচী পাতা থেকে মডেলটি গ্রহণ করে যখন কোনওটিরই সংজ্ঞা দেওয়া হয় না বা প্রয়োজন হয় না এবং আমি যদি আংশিক মডেলটিকে সূচিপত্রটিতে সেট করি তবে ভিউডাটা সম্পত্তিটি বাতিল! ?? এই পরিস্থিতি ঠিক কিভাবে? আংশিক লেআউটে স্থানান্তর করা কাজ করে তবে আমি কীভাবে এটি কাজ করে তা বুঝতে চাই।
এটিয়েন চারল্যান্ড

আমার আংশিক দৃশ্যের উপরে "@ পৃষ্ঠা" থাকলে "@ মডেল" ছাড়াই আমি একই ত্রুটিতে চলে এসেছি। "@ পৃষ্ঠা" সরানো সমস্যার সমাধান করেছে।
EKanadily

4
আপনি যদি ইচ্ছাকৃতভাবে শূন্য থাকে তখন আংশিক দৃশ্যে নাল মডেলটি প্রেরণ করতে চান তবে আপনি এটি Model.MyBarকরতে পারেন: @Html.Partial("_Bar", Model.MyBar, new System.Web.Mvc.ViewDataDictionary()) উত্স: https://stackoverflow.com/a/713921/4888725
গ্রোভার

@ সিমিক্স এটি একটি খুব সহায়ক মন্তব্য। শুধু এই মধ্যে দৌড়ে।
যোগাযোগমেট

7

এই প্রশ্নের ইতিমধ্যে একটি দুর্দান্ত উত্তর রয়েছে, তবে আমি একই ত্রুটির মধ্যে দৌড়েছি, ভিন্ন দৃশ্যে : এডিটরটিম্পলেটটিতেList একটি প্রদর্শিত হচ্ছে

আমার এইরকম একটি মডেল রয়েছে:

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)

এবং এটি আমার বার এডিটর টেম্পলেট ( বার. cshtml )

@model List<Bar>

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

And I got this error:

The model item passed into the dictionary is of type 'Bar', but this dictionary requires a model item of type 'System.Collections.Generic.List`1[Bar]


The reason for this error is that EditorFor already iterates the List for you, so if you pass a collection to it, it would display the editor template once for each item in the collection.

This is how I fixed this problem:

Brought the styles outside of the editor template, and into the main view:

@model Foo

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

And changed the EditorTemplate (Bar.cshtml) to this:

@model Bar

<label>@Model.BarName</label>

1
Awesome, you just saved me after half an hour scratching my head. Works for ASP.NET Core 3.1 MVC, too.
Uwe Keim

6

Observe if the view has the model required:

View

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

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

Controller

[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);
}

In my case I Use a partial view but runs in normal views


1
What does this have to do with the question?

2
@StephenMuecke this champs - The model item passed into the dictionary is of type Bar but this dictionary requires a model item of type Foo
CelzioBR
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.