【问题标题】:The model item passed into the dictionary is of type... ut this dictionary requires a model item of type传入字典的模型项是类型...但是这个字典需要一个类型的模型项
【发布时间】:2011-07-10 21:37:14
【问题描述】:

我是探索 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”类型的模型项。

我了解问题所在,但并不真正知道解决方案。

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>

} `

任何提示/想法?

【问题讨论】:

    标签: asp.net-mvc-3 razor


    【解决方案1】:

    又快又脏:用Html.RenderAction代替Html.RenderPartial

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

    并且在Account 控制器的LogOn 操作中确保返回PartialView,否则您将遇到堆栈溢出并且Cassini 将崩溃:

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

    【讨论】:

    • 我现在已经这样尝试过了,它可以工作,不再出现错误,但我必须登录两次才能显示欢迎用户的内容(除非我在第一次按下提交后点击刷新)我怎样才能防止这种情况发生?
    • +1 '因为它可以工作,但是它会导致再次调用布局文件,这很丑
    【解决方案2】:

    我认为您的“新闻”视图已经有一个与之关联的模型。 也许是这样开始的?:

    @model LeagueSite.Models.News
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-15
      • 2015-07-05
      相关资源
      最近更新 更多