传递到字典中的模型项是类型的...这个字典需要类型的模型项

时间:2011-07-10 21:37:14

标签: asp.net-mvc-3 razor

我是探索MVC3的新手,并提出了一个问题。

我正在编辑我的主视图,并且希望在用户未登录时在每个页面上显示登录框。我使用此代码完成了此操作:

@if (Request.IsAuthenticated)
        {
<text>Welcome <strong>@User.Identity.Name</strong>!
[ @Html.ActionLink("Log Off", "LogOff", "Account") ]</text>
        }
        else
        {
           Html.RenderPartial("../Account/LogOn");
        }

这适用于转到HomeController的普通Index方法。

但是,当我转到我的NewsController的Index方法时,我收到以下错误:

  

传递到字典中的模型项的类型为'System.Collections.Generic.List`1 [LeagueSite.Models.News]',但此字典需要类型为'leagueSite.Models.LogOnModel'的模型项。< / p>

我明白问题是什么,但实际上并不知道它的解决方案。

视图LogOn看起来像这样(标准的MVC3登录视图):

@model LeagueSite.Models.LogOnModel

@{
    ViewBag.Title = "Log On";
}

<h2>Login</h2>
<p>
    Please enter your user name and password. @Html.ActionLink("Register", "Register") if you don't have an account.
</p>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.")

@using (Html.BeginForm()) {
    <div>
        <fieldset>
            <legend>Account Information</legend>

            <div class="editor-label">
                @Html.LabelFor(m => m.UserName)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.UserName)
                @Html.ValidationMessageFor(m => m.UserName)
            </div>

            <div class="editor-label">
                @Html.LabelFor(m => m.Password)
            </div>
            <div class="editor-field">
                @Html.PasswordFor(m => m.Password)
                @Html.ValidationMessageFor(m => m.Password)
            </div>

            <div class="editor-label">
                @Html.CheckBoxFor(m => m.RememberMe)
                @Html.LabelFor(m => m.RememberMe)
            </div>

            <p>
                <input type="submit" value="Log On" />
            </p>
        </fieldset>
</div>

} `

任何提示/想法?

2 个答案:

答案 0 :(得分:1)

快速而肮脏:而非Html.RenderPartial使用Html.RenderAction

Html.RenderAction("LogOn", "Account");

并且在LogOn控制器的Account操作中确保返回PartialView或者您将获得堆栈溢出并且Cassini将崩溃:

public ActionResult LogOn()
{
    return PartialView();
}

答案 1 :(得分:1)

我认为你的“新闻”视图已经有了与之相关的模型。 也许它是这样开始的?:

@model LeagueSite.Models.News

好吧,如果是这样,如果你没有将模型传递给你的局部视图,那么框架默认假设该部分的模型是“LeagueSite.Models.News”,这当然不是你想要的。您必须将LogOnModel传递到LogOn局部视图,如下所示:

 Html.RenderPartial("../Account/LogOn", Model.ObjLogonModel);

这假设您在“新闻”模型中有一个LogonModel实例。那么你将能够处理登录操作 问候