【问题标题】:PartialView rendering not rendering on home page, throwing HttpExceptionn部分视图渲染未在主页上渲染,抛出 HttpException
【发布时间】:2015-05-07 15:18:48
【问题描述】:

我正在学习 MVC,我正在尝试在主页上呈现部分视图。 我收到以下错误:

“HttpException”

我很简单的模型如下:

public class simpleModel
{
    public int id { get; set; }
    public string Name { get; set; }
}

控制器:

public ActionResult ShowNames()
{
    UsersContext db = new UsersContext();               
    return PartialView(db.SimpleModels.ToList());
}

局部视图:

@model List<MvcApplication1.Models.simpleModel>
@if (Model != null)
{
   <ul>
      @foreach (var item in Model)
      {
        <li>@item.Name</li>
      }
</ul>
}

我希望我的局部视图呈现的主页是

@{
    ViewBag.Title = "Home Page";
}
@section featured {
    <section class="featured">
        <p>To learn more about ASP.NET MVC visit </p>
    </section>
}
@{
    Html.RenderAction("ShowNames", "Simple");
}

【问题讨论】:

  • 当视图有实例模型MvcApplication1.Models.simpleModel时,您正在传递一个集合List

标签: asp.net-mvc asp.net-mvc-partialview


【解决方案1】:

您的ShowNames() 方法将simpleModel 项目的集合返回到视图(如db.SimpleModels.ToList()),但您的部分将模型声明为单个simpleModel 对象。这会抛出异常,就像您尝试使用 foreach 循环迭代单个对象一样。

将局部视图模型声明更改为

@model List<MvcApplication1.Models.simpleModel>

但由于&lt;li&gt;name&lt;/li&gt; 只会返回文本“名称”(或假设它实际上是&lt;li&gt;@name&lt;/li&gt;,那么它将返回文本“MvcApplication1.Models.simpleModel”,除非您覆盖了ToString()simpleModel 方法),所以你需要访问对象的一个​​属性

<ul>
    @foreach (var item in model)
    {
        <li>@item.Name</li>
    }
</ul>

【讨论】:

  • 谢谢斯蒂芬,我试过了,但结果还是一样的异常。
  • 我的答案修复了您的代码可能引发的 2 个异常。如果您仍然有异常,这不是因为您显示的代码 - 我已经对其进行了测试(手动将一些 simpleModel 对象添加到集合中)并且它工作正常。您需要显示堆栈跟踪(并删除该图像 - 它根本没有帮助)
  • 您还应该在局部视图的第一行放置一个断点,以帮助缩小错误原因。
  • 我试图在局部视图中放置断点。但它无法达到他们的。它在索引页本身上抛出异常。在@{ Html.RenderAction("ShowNames", "Simple"); }
  • 感谢斯蒂芬的回答。这对我很有帮助。
【解决方案2】:

您的模型可能为空,即它没有任何数据。 所以,你应该在 foreachloop 之前检查一下

@model 列表

@if(model != null)
{
<ul>
    @foreach (var item in model)
    {
        <li>@item.Name</li>
   }
</ul>
}

【讨论】:

  • 模型有 3 个项目,它不为空。
【解决方案3】:

尝试将 [ChildActionOnly] 属性添加到您的 ShowNames 方法中。

【讨论】:

    最近更新 更多