/ / Свързване на множество модели в 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 })

Трябва да създадете потребител в контролера, но можете да предавате само един viewModel, така че да можете да създадете нов модел на преглед с две свойства: 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");

Така че сте разделили логиката на Менюто от логиката на Кухни и не трябва да получавате потребител във всеки контролер, който правите от менюто.


1 за отговор № 2

Проблемът тук е, че частичният ви изглед се опитва да се зареди, но вашият контролер не е преминал правилния модел.

Има няколко решения за това, в зависимост от приложението ви.

Можете да проверите дали частичният изглед трябва да се зареди по време на текущото действие, без да се показва, ако не е

Можете да промените бизнес моделите си, за да позволите и на двата вида да получат един и същ модел

Можете да предавате информация на частичния изглед чрез ViewBag, вместо да използвате модела за свързване

Или можете да изградите екземпляр от класа си InstaFood.Core.User в рамките на различните класове на модела и да извикате частичния изглед с

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