【问题标题】:@Html.DisplayFor() is not working with custom model sub-class@Html.DisplayFor() 不适用于自定义模型子类
【发布时间】:2015-07-22 16:34:32
【问题描述】:

所以我有一个 MVC 应用程序来管理站点列表,并且在我的详细信息视图中,即使 @Html.DisplayNameFor 正确呈现标签,我的模型中的任何子类都不会呈现任何内容。

这是正常工作的视图代码:

<tr>
    <td>
        <span class="label label-info">@Html.DisplayNameFor(model => model.SiteName)</span>
    </td>

    <td style="text-align: center;">
        @Html.DisplayFor(model => model.SiteName)
    </td>
</tr>

这是 DisplayFor 什么都不生成的代码:

<tr>
    <td>
        <span class="label label-info">@Html.DisplayNameFor(model => model.Version.VersionName)</span>
    </td>

    <td style="text-align: center;">
        @Html.DisplayFor(model => model.Version.VersionName)
    </td>
</tr>

这是我的站点模型:

public class Site
{
    public int ID { get; set; }

    [Required]
    [Display(Name = "Link")]
    [DataType(DataType.Url)]
    public string SiteLink { get; set; }

    [Required]
    [Display(Name = "Name")]
    public string SiteName { get; set; }

    public int VersionId { get; set; }

    [ForeignKey("VersionId")]
    public Version Version { get; set; }
}

还有我的版本类:

public class Version
{
    public int ID { get; set; }

    [Display(Name = "Version")]
    public string VersionName { get; set; }

    public List<Site> Sites { get; set; }
}

最后,这是我的控制器中的 Details ActionResult 方法:

public ActionResult Details(int id = 0)
{
    Site site = db.Sites.Find(id);
    if (site == null)
    {
        return HttpNotFound();
    }
    return View(site);
}

我的所有其他视图都呈现得很好,只是这个细节视图似乎没有为我的自定义类返回任何内容。

【问题讨论】:

  • 如果你使用“@Model.Version.VersionName”而不是 DisplayFor(),你看到了什么吗?
  • 不,我已经尝试过了,但实际上得到了 Object Ref 错误 :)
  • 好的...所以你的问题是版本为空
  • @Romias,是的,基于该错误,我意识到版本为空,但不确定原因。下面的答案是我的问题的解决方案,我必须将版本子显式加载到我的站点模型中。

标签: c# asp.net-mvc html-helper


【解决方案1】:

您需要显式加载子(版本):

Site site = db.Sites.Find(id);
if (site == null)
{
    return HttpNotFound();
}
db.Entry(site).Reference(p => p.Version).Load(); 
return View(site);

你也可以这样做

db.Sites.Include(s => s.Version).FirstOrDefault(s => s.Id == id);

https://msdn.microsoft.com/en-us/data/jj574232.aspx#explicit

【讨论】:

  • 我最终使用了您的第二个建议,因此我可以将所有子对象加载到一行中。语法实际上是 db.Sites.Include(s => s.Version).Include(... etc).FirstOrDefault(s => s.Id == id);再次感谢
猜你喜欢
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多