Asp.Net MVC中的多个模型绑定

时间:2014-11-28 12:49:49

标签: asp.net-mvc razor model-binding

我有一个模型绑定的视图喜欢这个

@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的新手,我不确定是什么导致了这个错误。我最好的猜测是,这是因为在一个视图中不同的模型绑定。

2 个答案:

答案 0 :(得分:1)

这里的问题是您的局部视图正在尝试加载但您的控制器没有通过它正确的模型。

根据您的应用,有几种解决方案可供选择。

您可以检查部分视图是否需要在当前操作期间加载,如果不是则显示

您可以更改商家模式,以允许两个视图都接收相同的模型

您可以通过ViewBag将信息传递给局部视图,而不是使用模型绑定

或者您可以在不同的模型类中构建InstaFood.Core.User类的实例,并使用

调用局部视图
@Html.Partial("yourPartialView", Model.yourCurrentModelInstafoodCoreUserInstance)

答案 1 :(得分:1)

您必须将模型传递给partial,而且必须是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,尤其是在许多视图或布局中使用此菜单时。您应该在Controller中创建另一个用于获取菜单的操作:

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");

因此,您已将菜单逻辑与Kitchens逻辑分开,并且您不必在每个呈现菜单的控制器中获取用户。