Доступ к объектам внутри модели, переданным в Razor View в ASP.NET MVC 3

#asp.net-mvc-3 #razor #viewmodel

#asp.net-mvc-3 #razor #viewmodel

Вопрос:

В моей модели beer есть объект brewery, но я не могу получить доступ к свойствам пивоварни, когда я нахожусь в представлении. Intellisense, похоже, думает, что я могу получить доступ к свойству brewery, но метод DisplayFor ничего не печатает.

 @model BeerRecommender.Models.Beer

@{
ViewBag.Title = "Details";
}

<h2>@Html.DisplayFor(model => model.Name)</h2>

<fieldset>
<legend>Details</legend>

<div class="display-label">Style: @Html.DisplayFor(model => model.Style.Name)</div>
<div class="display-label">Brewery: @Html.DisplayFor(model => model.Brewery.Name)</div>

</fieldset>
  

Вот класс Beer:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using BeerRecommender.Models.ViewModels;

namespace BeerRecommender.Models
{
public class Beer
{
    [Key]
    public int BeerID { get; set; }

    public ICollection<City> Cities { get; set; }

    public ICollection<Tag> Tags { get; set; }

    public Style Style { get; set; }

    public string Name { get; set; }

    public Brewery Brewery { get; set; }
}
  

…и вот класс Brewery:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ComponentModel.DataAnnotations;

namespace BeerRecommender.Models
{
public class Brewery
{
    [Key]
    public int BreweryID { get; set; }

    public string Name { get; set; }

    public ICollection<Beer> Beers { get; set; }

    public City City { get; set; }
}
}
  

Комментарии:

1. Глупый вопрос, но вы уверены, что в Пиве действительно присутствует свойство пивоварни? Это единственная причина, по которой я вижу, чтобы это не отображалось.

2. Вы правы. Когда я смотрю на авто после инициализации beer в методе details beerscontroller, инициализируются только строковые поля. Инструкция гласит: «Beer пиво = контекст. Beers.find(id); «Я думаю, мне нужен какой-то другой код LINQ для включения других свойств. Я не уверен, где и как использовать код LINQ, предложенный Адамом.

Ответ №1:

Как вы загружаете класс Beer? Если это, скажем, из entity framework, вам нужно будет вызвать.Включите (o => o.Brewery) в свой код загрузки, чтобы включить эту таблицу. Это предполагает EF 4.1, в противном случае вам нужно имя строки, подобное .Включить («Пивоварня»), если в 4.0

Комментарии:

1. Посмотрите комментарий, который я написал для competent_tech выше, и посмотрите, имеет ли это какой-либо смысл.

2. Это сработало! Это работает и для включения нескольких объектов. Я изучил, как правильно создавать запросы LINQ вместо того, чтобы использовать каркасный запрос, и это помогло. Спасибо.