2017-02-03 2 views
1

Привет всем Я в здании приложение, которое позволяет пользователям отправить сообщения, и я пытаюсь использовать OrderBy в списке в порядке возрастания, но я получаю эту ошибкуOrderBy Возрастание на asp.net ошибке список

Ошибка

модели элемент передается в словарь типа 'System.Linq.OrderedEnumerable'2 [myproject.Models.NewsPostVM, System.Nullable'1 [System.Int32]], но этот словарь требует элемента модели типа 'System.Collections.Generic.List'1 [myproject.Models.NewsPostVM]'. контроллер

public ActionResult News() 
{ 
    var posts = db.NewsPosts.Select(d => new NewsPostVM() 
    { 
     ID = d.ID, 
     Heading = d.Heading, 
     Body = d.Body, 
     Images = d.Images.Select(i => new NewsImageVM() 
     { 
      Path = i.Path, 
      FileName = i.DisplayName 
     }).ToList() 
    }).ToList(); 
    var post= posts.OrderBy(m => m.ID); 
    return View(post); 
} 

вид

@model List<MyProject.Models.NewsPostVM> 
@foreach (var p in Model) 
{ 
    <div class="w3-container w3-center"> 
     <h5><b>@p.Heading</b></h5> 
     <p>@p.Body</p> 
     @foreach (var image in p.Images) 
     { 
      <img class="img-thumbnail" width="150" height="150" src="~/Images/@image.Path" /> 
     } 
     <h6>@p.Date</h6> 
    </div> 
} 
+2

Либо изменить определение модели, чтобы принять IEnumerable '@model IEnumerable ' или добавить 'ToList()' для возврата списка из вашего _controller_ следующим образом: 'var post = posts.OrderBy (m => m.ID) .ToList(); ' –

+0

Используйте' var posts = db.NewsPosts.OrderByx => x.ID). Выберите (d => new NewsPostVM() {...}). ToList(); ' и удалите 'var post = posts.OrderBy (m => m.ID);' - его более эффективный ответ (но не используйте 'var', и это было бы очевидно) –

ответ

3

Вы должны вызвать ToList на данных модели перед назначением его:

var post= posts.OrderBy(m => m.ID).ToList(); 
return View(post); 

Alternative вы можете изменить модель для вашего зрения, чтобы принять IEnumerable (если вы просто проходите через него, IEnumerable в порядке):

@model IEnumerable<MyProject.Models.NewsPostVM> 
+0

Спасибо, вы решили мою проблему отметит это как ответ, когда смогу – ARandomUserNamedChuck

+0

@ARandomUserNamedChuck приветствуется –

0

Поскольку вы используете «var» в качестве типа переменной, компилятор выбирает IOrderedEnumerable как лучший подходящий тип. Однако ваше мнение ожидает список.

использование «ToList», чтобы заставить результат быть список:

var post= posts.OrderBy(m => m.ID).ToList(); 

Вы можете избежать этого неожиданного поведения, указав ваши типы переменных, как:

IList<NewsPostVM> posts = posts.OrderBy(m => m.ID).ToList(); 
+2

вы не могли бы назначить IEnumerable List, вторая строка не будет компилироваться –

+0

Вы правы. Изменил его, чтобы использовать .ToList(). Это немного больше кода, но гарантирует, что типы переменных не «волшебным образом» меняются для более новых пользователей. – middelpat