/ / Asp.Net MVC में कई मॉडल बाइंडिंग - asp.net-mvc, रेजर, मॉडल-बाइंडिंग

Asp.Net MVC में कई मॉडल बाइंडिंग - asp.net-mvc, रेजर, मॉडल-बाइंडिंग

मेरे पास एक ऐसा विचार है जिसके लिए एक मॉडल को पसंद किया जाता है

@model IEnumerable<InstaFood.Core.Kitchen>

इस तरह मैं आंशिक दृश्य जोड़ने की कोशिश कर रहा हूं

@Html.Partial("~/Views/Home/helperTemplates/_menu.cshtml")

मेरे नियंत्रक में मेरे पास यह है

    public ActionResult ViewKitchens()
{
IEnumerable<Kitchen> k = Kitchen.GetAll();
return View(k);
}

मेरे मुख्य विचार में मेरे पास एक आंशिक दृष्टिकोण है जो इस तरह के एक अलग मॉडल के लिए बाध्य है

@model InstaFood.Core.User



<div class="row">
<div class="large-12 columns">
<nav class="top-bar" data-topbar role="navigation">
<ul class="title-area">
<li class="name">
<h1 class="show-for-small-only"><a href>Menu</a></h1>
</li>
<li class="toggle-topbar menu-icon"><a href="#"><span></span></a>
</li>
</ul>
<section class="top-bar-section">
<ul class="left">
<li class="divider"></li>
<li>@Html.ActionLink("Home", "Dashboard", "Home")</li>
<li class="divider"></li>
<li>@Html.ActionLink("View Kitchens", "ViewKitchens", "Home")</li>
<li class="divider"></li>
<li>@Html.ActionLink("View Institutes", "ViewInstitutes", "Home")</li>
</ul>

<ul class="right">
<li class="has-dropdown">
<a href="#">@Model.EmailAddress</a>
<ul class="dropdown">
<li>@Html.ActionLink("Logout", "Logout", "Account")</li>
</ul>
</li>
</ul>

</section>
</nav>
</div>

अब जब मैं अपना कोड चलाता हूं तो मुझे यह अपवाद मिलता है,

The model item passed into the dictionary is of type "Microsoft.WindowsAzure.Storage.Core.Util.CommonUtility+<LazyEnumerable>d__0`1[InstaFood.Core.Kitchen]", but this dictionary requires a model item of type "InstaFood.Core.User".

इस मुद्दे का कोई हल? जैसा कि मैं asp.net mvc के लिए बहुत नया हूं मुझे वास्तव में यकीन नहीं है कि इस त्रुटि का कारण क्या है। मेरा सबसे अच्छा अनुमान है कि यह एक दृश्य में विभिन्न मॉडल बाइंडिंग के कारण है।

उत्तर:

उत्तर № 1 के लिए 1

आपको अपने आंशिक मॉडल को पास करना होगा और इसका उदाहरण होना चाहिए InstaFood.Core.User। ऐसा करने के कई तरीके हैं:

@Html.Partial("~/Views/Home/helperTemplates/_menu.cshtml", new ViewDataDictionary { Model = user })

आपको उपयोगकर्ता को नियंत्रक में बनाना चाहिए लेकिन आप केवल एक ही दृश्य देख सकते हैं InstaFood.Core.User और दुसरी IEnumerable<InstaFood.Core.Kitchen>।:

class ViewModel
{
public IEnumerable<InstaFood.Core.Kitchen> Kitchens {get; set;}

public InstaFood.Core.User User {get; set;}
}

और इसे देखने के लिए पास करें।

लेकिन आपके मामले में उपयोग करना बेहतर है @ Html.Action खासकर जब आप इस मेनू का उपयोग कई दृश्यों या लेआउट में करते हैं। आपको मेनू प्राप्त करने के लिए नियंत्रक में एक और कार्रवाई करनी चाहिए:

public class Nav : Controller
{
...
public ActionResult Menu()
{
var user = new InstaFood.Core.User();//get oure user
return View("~/Views/Home/helperTemplates/_menu.cshtml", user);
}

और देखने में:

...
@Html.Action("Menu", "Nav");

तो आपने रसोई तर्क से मेनू तर्क को अलग कर दिया है और आप मेनू को प्रस्तुत करने वाले प्रत्येक नियंत्रक में उपयोगकर्ता को प्राप्त नहीं करते हैं।


उत्तर № 2 के लिए 1

यहां समस्या यह है कि आपका आंशिक दृश्य लोड करने का प्रयास कर रहा है, लेकिन आपके नियंत्रक ने इसे उचित मॉडल नहीं दिया है।

विशेष रूप से आपके ऐप के आधार पर इसके कई समाधान हैं।

आप देख सकते हैं कि वर्तमान क्रिया के दौरान आंशिक दृश्य लोड होने की आवश्यकता है, यह नहीं दिखा रहा है कि यह "t" नहीं है

आप दोनों मॉडल को एक ही मॉडल प्राप्त करने की अनुमति देने के लिए अपने व्यवसाय मॉडल बदल सकते हैं

आप मॉडल बाइंडिंग का उपयोग करने के बजाय ViewBag के माध्यम से आंशिक दृश्य में जानकारी पास कर सकते हैं

या आप अपने विभिन्न मॉडल कक्षाओं के भीतर अपने InstaFood.Core.User वर्ग का एक उदाहरण बना सकते हैं और आंशिक दृश्य कॉल कर सकते हैं

@Html.Partial("yourPartialView", Model.yourCurrentModelInstafoodCoreUserInstance)