2014-01-09 2 views
1

Update:ASP.NET MVC кажется не передать соответствующие значения на его взгляд

enter image description here После использования Include, имя еще не обнаруживается. Затем я сделал отладку и нашел нечетный материал.

Я проверяю пользователей внутри объекта db и обнаружил, что его счет = 0 (см. 1), , затем я нажал значок обновления, который расположен в области 3, чтобы я мог видеть представление результатов в области 2. После этого , пользователи загружаются. Но я до сих пор не могу получить пользователей на первом месте, даже я указал

db.Configuration.LazyLoadingEnabled = false; 

. Пожалуйста, помогите


Сообщения Начало здесь:

Я учусь MVC, и у меня есть очень простая модель данных.

Произнесение собрания связано с его организатором, который является экземпляром пользователя.

И я использую EF6.

Вот мой код

public ActionResult Index() 
     { 
      myEntities db = new myEntities(); 

      return View(db.meetings); 
     } 

Каждой встреча объектная ассоциируется с пользователями группы и имеет поле под названием organizer_id, который является идентификатором пользователя.

Я хотел бы перечислить все встречи на своей домашней странице и имена их организаторов.

Вот мой Razor код

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.title) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.address) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.event_date_time) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.description) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.users.SingleOrDefault(u => u.id == item.organizer_id).name) 
     </td> 
     .............. 

В ячейке имя организатора, он всегда будет отображаться ничего. Я сделал пошаговую отладку и обнаружил, что у меня есть доступ к связанным пользователям для каждой встречи во внутреннем C# -кодировании, но когда она идет в Razor, элемент имеет свои собственные значения, но ассоциированные пользователи, которые item.users null (потому что я проверил item.users.Count был 0).

Вот почему я пришел к выводу.

Может ли кто-нибудь указать на мою ошибку, пожалуйста?

Заранее спасибо

+0

привет? Кто-нибудь пожалуйста? Проблема кажется чем-то связанным с ленивой загрузкой, но даже я установил Cdb.Configuration.LazyLoadingEnabled = false; он все равно не работает ~~ – Franva

ответ

0

Я, наконец, решил эту проблему самостоятельно.

вот что я сделал (честно говоря, я знаю, что это не «стандартный» способ сделать это, если вы знаете, как правильно исправить эту проблему должным образом и достойно, пожалуйста, ДОБАВИТЕ ВАШИ ОТВЕТЫ. СПАСИБО!)

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

Но это определенно не правильный способ сделать это. Любой, кто знает, как его решить, ПОЖАЛУЙСТА, ДОБАВИТЕ ВАШИ ОТВЕТЫ.

СПАСИБО ВАС ОЧЕНЬ МНОГО!

2

Это происходит потому, что ваш контекст выходит за рамки на ваш взгляд. Что вам нужно сделать, это включить всех пользователей в ваш контроллер, чтобы, по вашему мнению, он искал в памяти.

public ActionResult Index() 
{ 
    myEntities db = new myEntities(); 
    var model = db.meetings.Include("users").ToList(); 
    return View(model); 
} 

Лучшее решение для создания конкретной модели для страницы, в которых все необходимые данные извлекаются и введены в пользовательской модели для зрения:

public class MeetingModel 
{ 
    public string Title{get;set;} 
    public string Address {get;set;} 
    public DateTime Date {get;set;} 
    public string Description {get;set;} 
    public string OrganizerName {get;set;} 
} 

В контроллере:

public ActionResult Index() 
{ 
    myEntities db = new myEntities(); 
    List<MeetingModel> models = db.meetings.Select(i => 
     new MeetingModel { 
      Title = i.title, 
      Address = i.address, 
      Date = i.event_date_time, 
      Description = i.description, 
      OrganizerName = i.users.SingleOrDefault(u => u.id == i.organizer_id).name 
     }).ToList(); 
    return View(models); 
} 

Затем изменить вид принять модель списка:

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Title) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Address) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Date) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Description) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.OrganizerName) 
     </td> 
     ...... 
+0

+1 Даже если было бы лучше заполнить ViewModel, а затем вернуть модель вместо Entity. –

+0

Согласен, но я думаю, что это был бы самый простой способ достижения цели. –

+1

Ответ правильный, причина неправильная - это ленивая загрузка. '.ToList()' заставляет данные загружаться, и поэтому все они доступны для представления. –

Смежные вопросы