传递到字典中的模型项是A类型,但此字典需要B类型的模型项

时间:2012-06-07 01:23:55

标签: asp.net-mvc-3 model views viewmodel

好的,有很多像这样的问题,我已经查看了大约1500磅。我看到的那些,人们要么发送错误的类型,要么他们正在做一些局部视图。我不是在做我的情况。所以,我的确切错误是:

传递到字典中的模型项的类型为“ClanSite.Models.ViewModels.CategoryViewModel”,但此字典需要“ClanSite.Models.ViewModels.UserLoginViewModel”类型的模型项。

问题是我的_Layout.cshtml(@model ClanSite.Models.ViewModels.UserLoginViewModel)上有一个模型,用于在每个页面上登录用户。

但是,在其中一个页面上,我试图渲染一个类别列表。我的CategoryViewModel只包含一个Category列表,GetCategories()返回List。

控制器

public ActionResult Categories()
    {
        CategoryViewModel cats = new CategoryViewModel();
        try
        {
            cats.Categories = ForumQueries.GetCategories();
        }
        catch
        {
            return RedirectToAction("Message", new { msg = "categories" });
        }
        return View(cats);
    }

查看

@model ClanSite.Models.ViewModels.CategoryViewModel
@{
    ViewBag.Title = "clanSite - Categories";
}
<div class="forumPostTable">
@foreach (ClanSite.Models.Tables.Join.Category cat in Model.Categories)
{
    <div class="forumPostTableRow cursorPointer" onclick="linkTo('@Url.Action("Index", "Home")')">
        <div class="forumCategoryTableCellTitle">
            <div class="forumCategoryTitle">
                <a href="" class="linkNoDecGold">Title</a>
            </div>
            <div class="forumCategoryTitleDesc">
                @cat.CategoryInfo.Description
            </div>
        </div>
    </div>
}
</div>

当我尝试转到此页面时,我收到错误消息。我使用调试器遍历页面并获取正确的数据:@ cat.CategoryInfo.Description

我真的很困惑,因为我能够使用该模型在另一个页面上创建用户注册表单而没有任何问题。那么,我如何在_Layout和View中使用模型,我只是循环输出数据?

2 个答案:

答案 0 :(得分:3)

我在MVC中有一个应用程序,它也需要很好地使用模型,我的方法是不使用_Layout.cshtml中的模型。如果存在这样的情况,例如所有页面中都需要并因此在_Layout.cshtml中定义的登录操作,则应使用RenderPartial调用,并且还应创建特定的模型。

<section id="login">
    @{ Html.RenderPartial("_Login", new MyProjectName.Models.Account.LoginModel()); }
</section>

所有页面都将提供部分视图和适当的模型。然后可以创建普通视图并将其显示在RenderBody()内的_Layout.cshtml标记中,而不会发生任何模型冲突。

答案 1 :(得分:0)

我实际上很容易绕过这个。我刚刚创建了一个只包含公共UserLoginViewModel成员的接口ILayout。然后我在CategoryViewModel中实现此接口。这意味着,我需要将UserLoginViewModel添加到CategoryViewModel,但这根本不是问题。我需要更改才能登录,而不是将UserLoginViewModel发送到处理登录的Action中的View,我发送了ILayout。