【问题标题】:MVC Partial View Will Not LoadMVC 部分视图不会加载
【发布时间】:2016-02-20 23:54:06
【问题描述】:

我不断收到如下错误消息:

..但是这个字典需要一个类型的模型项..

我试图将部分视图放入的视图是:

@using TheNovelMachine.Models
@model TheNovelMachine.Models.Account

@{
    ViewBag.Title = "Details";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<img id="homeimage" src="~/Image/front-page-book.jpg" alt="The Novel Machine" />

<div id="text" class="col-lg-12">
    <h1>Profile</h1>
    <div class="col-lg-6 no-gutter">
        <h2>@Html.DisplayFor(model => model.Username)</h2>
        <h4>@Html.DisplayFor(model => model.FullName)</h4>
        <p>@Html.DisplayFor(model => model.Email)</p>
    </div>

    <div class="col-lg-6 pull-right text-right no-gutter">
        <img class="profilepic" src="~/Image/@(Html.DisplayFor(model => model.Username)).jpg" />
    </div>

    <div class="col-lg-12 no-gutter">
        <hr/>
        <h4>@Html.DisplayFor(model => model.Username)'s Novels</h4>
        @{
            Html.RenderPartial("~/Views/Shared/_NovelProfile.cshtml");
        }
    </div>

</div>

部分视图是:

@using System.Web.DynamicData
@using TheNovelMachine.Models
@model IEnumerable<TheNovelMachine.Models.Novel>


<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Genre)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Abstract)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Privacy)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.AccountId)
        </th>
    </tr>

@foreach (var item in Model.Where(i => i.AccountId.ToString() == Url.RequestContext.RouteData.Values["id"].ToString())) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Genre)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Abstract)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Privacy)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.AccountId)
        </td>
    </tr>
}

</table>

【问题讨论】:

  • 有几点需要注意,首先当您调用.Where(...) 时,您正在视图中执行逻辑,通常不赞成视图中的逻辑。其次(可选),不要循环遍历项目,而是为 Novel 创建一个 DisplayTemplate,然后简单地将整个循环替换为 @Html.DisplayFor(m =&gt; m)

标签: c# asp.net-mvc asp.net-mvc-4


【解决方案1】:

你的局部视图期待这个模型(你在局部视图的顶部声明它)

@model IEnumerable<TheNovelMachine.Models.Novel>

您应该在这一行中传递该模型:

@{
        Html.RenderPartial("~/Views/Shared/_NovelProfile.cshtml", Model.Novels);
}

假设Model.Novels 属于这种IEnumerable&lt;TheNovelMachine.Models.Novel&gt; 类型,或者它可以转换为那种类型,这应该可以工作。

Here你有一个更详细的例子,但想法是一样的。如果您不将此作为参数传递,则无法构造局部视图(这就是您收到该错误的原因)。

MSDN RenderPartial 方法的文档。

【讨论】:

    【解决方案2】:

    因此,即使对于您需要做什么还有其他答案,但这是实际发生的事情,所以您将来会知道。

    @Html.RenderPartial("_NovelProfile");
    

    将与以下代码相同:

    @Html.RenderPartial("_NovelProfile", Model)
    

    【讨论】:

      猜你喜欢
      • 2011-03-31
      • 2017-06-14
      • 1970-01-01
      • 2015-08-03
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多