@ Html.DisplayFor () не работает с подклассом пользовательской модели

Итак, у меня есть приложение 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);
}

Все другие мои представления отображаются просто отлично, просто это подробное представление, похоже, ничего не возвращает для моих пользовательских классов.


person raptordfx    schedule 22.07.2015    source источник
comment
Если вы используете @ Model.Version.VersionName вместо DisplayFor (), вы что-то видите?   -  person Romias    schedule 22.07.2015
comment
Нет, я уже пробовал это и вместо этого получил ошибку Object Ref :)   -  person raptordfx    schedule 22.07.2015
comment
Хорошо ... Итак, ваша проблема в том, что версия равна нулю   -  person Romias    schedule 22.07.2015
comment
@Romias, да, я понял, что версия была нулевой на основе этой ошибки, но не знал, почему. Ответ ниже - это решение моей проблемы, мне пришлось явно загрузить дочернюю версию Version в модель моего сайта.   -  person raptordfx    schedule 22.07.2015


Ответы (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

person Steve Greene    schedule 22.07.2015
comment
В итоге я воспользовался вашим вторым предложением, чтобы загрузить все свои дочерние объекты в одну строку. Фактически это синтаксис db.Sites.Include (s = ›s.Version) .Include (... etc) .FirstOrDefault (s =› s.Id == id); Спасибо еще раз - person raptordfx; 22.07.2015