2015-11-15 3 views
0

Я пытаюсь просмотреть информацию из двух таблиц в представлении с помощью модели представления, но это не сработает.ViewModel не работает. Отображение из двух таблиц

Это дает две таблицы с информацией.

public class HeatImage 
{ 
    [Key] 
    public int ImageId { get; set; } 
    public string name { get; set; } 
} 

public class HeatingArea 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Area { get; set; } 

} 

Мой ViewModel

public class HeatingAreaViewModel 
{ 
    public IEnumerable<HeatImage> heatingImage { get; set; } 
    public IEnumerable<HeatingArea> heatingArea { get; set; } 
} 

Мой контроллер

public ActionResult Index() 
     { 
      HeatingAreaViewModel mymodel = new HeatingAreaViewModel(); 
      mymodel.heatingArea = db.HeatingAreas.ToList(); 
      mymodel.heatingImage = db.HeatImages.ToList(); 

      return View(mymodel); 
     } 

И мой взгляд

@model IEnumerable<Project.Models.HeatingAreaViewModel> 
@foreach (var item in Model) 
      { 
       <a href="~/folder/@item.heatingImage">@item.heatingArea</a> 
      } 

Ошибка

модель элемент передается в словарь типа «Project.Models.HeatingAreaViewModel», но этот словарь требует модели элемента типа а «System.Collections.Generic.IEnumerable`1 [Project.Models.HeatingAreaViewModel] ».

+1

Кстати, под MVC он известен как _model_ ** не ** _ "ViewModel" _. https://msdn.microsoft.com/en-us/library/dd381412(v=vs.108).aspx – MickyD

+2

@ Мики, есть модели и ViewModels. См. Это сообщение: [Что такое ViewModel в MVC?] (Http://stackoverflow.com/a/11074506/1454538) – mezmi

+1

@ ᴉʞuǝ Спасибо за упоминание моего сообщения/ответа –

ответ

0

Ваше мнение ожидает IEnumerable of HeatingAreaViewModel, и кажется, что вы только передаете один экземпляр.

Изменить этот

@model IEnumerable<Project.Models.HeatingAreaViewModel> 

к этому

@model Project.Models.HeatingAreaViewModel 

Тогда вы будете в состоянии петли через heatingArea и heatingImage свойствами, как этот

@foreach (var item in model.heatingArea) 
{ 
    //what ever you need to do here 
} 
+0

Спасибо, но как я могу получить как нагрев, так и нагрев в одном цикле? Я хочу создать эту ссылку '@item.heatingArea' – Xtreme

+1

Я не уверен, что вы можете перебирать два IEnumerables в одном цикле. Можете ли вы объяснить, что именно вы пытаетесь сделать? 'heatingImage' и' heatingArea' - два отдельных списка. – mezmi

+0

@ Xtreme, о, поэтому вы пытаетесь решить другую проблему, как сместить два списка вместе, а не как отображать его в представлении MVC, я собираюсь написать второй ответ, см., Что один для решения и дальнейшие комментарии. – Dano

1

Сообщение об ошибке сообщает ему : View ожидает IEnumerable из HeatingAreaViewModel, в то время как действие вашего контроллера посылается только на просмотр HeatingAreaViewModel.

Так что либо исправьте контроллер для отправки списка HeatingAreaViewModel, либо исправьте представление, чтобы ожидать только одного экземпляра HeatingAreaViewModel.

+0

Как я могу изменить свой контроллер? – Xtreme

+0

@Xtreme, вы не меняете контроллер, вы меняете представление на 'model Project.Models.HeatingAreaViewModel', а затем' @foreach (элемент var в Model.heatingImage) 'и/или' @foreach (элемент var в Model .heatingArea) ' –

0

Если ваша проблема, как перебираются в одной петле через два списка HeatingImage и HeatingArea, на ваш взгляд, вы должны переделать ваш ViewModel:

public class HeatingAreaViewModel 
{ 
    public HeatImage heatingImage { get; set; } 
    public HeatingArea heatingArea { get; set; } 
} 

, а затем действие контроллера:

public ActionResult Index() 
      { 
       heatingAreas = db.HeatingAreas.ToList(); 
       heatingImages = db.HeatImages.ToList(); 

       List<HeatingAreaViewModel> myModel = heatingAreas.Zip(heatingImages, (a, b) => new HeatingAreaViewModel {HeatingArea = a, HeatImage = b}) 

       return View(mymodel); 
      } 

Тогда представление будет работать, как есть.

Тем не менее, я настоятельно совет против этого. Вы должны убедиться, что соответствующие элементы в этих двух списках действительно соответствуют друг другу. Который очень подвержен ошибкам. Если существует базовая логика, которая связывает эти два списка вместе (некоторые отношения по таблицам базы данных), я бы использовал этот, чтобы присоединиться к спискам/таблицам вместе.

0

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

@model HeatingAreaViewModel 
@foreach (var item in Model.heatingImage) 
{ 
    <a href="~/folder/@item.heatingImage">@item.heatingArea</a> 
} 
1

Вы отправляете через Appels и ожидавшие апельсины , поэтому вы получаете ошибку.

В вашем контроллере вы отправляете один (один) экземпляр HeatingAreaViewModel. По вашему мнению, вы предоставляете исключение из списка HeatingAreaViewModel экземпляров (более 1).

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

public class HeatViewModel 
{ 
    public HeatImage HeatImage { get; set; } 

    public HeatingArea HeatingArea { get; set; } 
} 

Вы пройдете этот HeatViewModel в виде списка на ваш взгляд.

public ActionResult Index() 
{ 
    // This is just dummy code 
    HeatingViewModel model1 = new HeatingAreaViewModel(); 
    // Populate the properties 
    model1.HeatImage = new HeatImage(); 
    // Populate the properties 
    model1.HeatingArea = new HeatingArea(); 

    HeatingViewModel model2 = new HeatingAreaViewModel(); 
    // Populate the properties 
    model2.HeatImage = new HeatImage(); 
    // Populate the properties 
    model2.HeatingArea = new HeatingArea(); 

    // Now pass this list to the view 
    List<HeatingViewModel> models = new List<HeatingViewModel>(); 

    return View(models); 
} 

На ваш взгляд ваш код будет выглядеть примерно так:

@model List<Project.Models.HeatingViewModel> 
@foreach (var item in Model) 
{ 
    <p>item.HeatImage.Name</p> 
    <p>item.HeatingArea.ID (I have used ID because I don't know what your Area looks like)</p> 
} 

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

Я также заметил, что вы начали свои свойства в нижнем регистре, лучшие практики начинают их с крышек. Например:

public HeatImage heatImage { get; set; } 

... должно быть ...

public HeatImage HeatImage { get; set; } 

Я надеюсь, что это помогает :)

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