C # ASP.NET Core - неверный тип данных передается в частичное представление? - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь создать простое приложение для чата, чтобы начать работу с ASP.NET, и мое частичное представление, похоже, получает тип данных, передаваемый в Index.cshtml, вместо данных, которые я намеревался передать в PersistantMessagesPartial.cshtml.

Ошибка: InvalidOperationException: Элемент модели, переданный в ViewDataDictionary, имеет тип 'System.Collections.Generic.List 1[WebChat.Areas.Identity.Data.AppUser]', but this ViewDataDictionary instance requires a model item of type 'System.Collections.Generic.List 1 [WebChat.Models.MessageModel]'.

В HomeController.cs:

 public async Task<IActionResult> Index()
    {
        Debug.WriteLine("debug1");
        return View(await _AppUserDBContext.userList.ToListAsync());
    }

    public async Task<IActionResult> _PersistantMessagesPartial()
    {
        Debug.WriteLine("debug2");
        return PartialView("_PersistantMessagesPartial", await _MessageModelDBContext.messageList.ToListAsync());
    }

В _PersistantMessagesPartial.cshtml:

@model List<WebChat.Models.MessageModel>
<script>
    console.log("test");
</script>
@foreach(var item in Model)
{
    <script>
        console.log("MessagePartial");
        console.log(@item.Contents);
    </script>
}

Как отобразить частичное в _Layout.cshtml:

<partial name="_PersistantMessagesPartial" />

Index.cshtml получает список AppUser, и это работает правильно.Я не уверен, как заставить _PersistantMessagesPartial получать список MessageModel вместо списка AppUser.

1 Ответ

3 голосов
/ 22 марта 2019

Вместо передачи списка объектов я бы создал класс:

public class PersistantMessagesPartialModel{
    public List<WebChat.Models.MessageModel> Messages{get;set;}
}

и передал бы объект, используя атрибут для , например:

@model IndexViewModel

<partial name="_PersistantMessagesPartial.cshtml" for="PersistantMessagesPartialModel" />

Тогда ваш частичный вид будет выглядеть так:

@model PersistantMessagesPartialModel

@foreach(var item in Model.Messages)
{
    <script>
        console.log("MessagePartial");
        console.log(@item.Contents);
    </script>
}

Контроллер будет выглядеть так:

  [HttpGet]
  public async Task<IActionResult> Index()
  {
       var viewModel = new IndexViewModel(){
          PersistantMessagesPartialModel = new 
          PersistantMessagesPartialModel(){
                Messages = await 
           _AppUserDBContext.userList.ToListAsync()
            };
      return View(viewModel);
   }

IndexViewModel будет выглядеть так:

public class IndexViewModel{
    public PersistantMessagesPartialModel  
    PersistantMessagesPartialModel {get;set;}
}

Я знаю, что ASP.NET MVC позволяет вам определять модель данной страницы как список объектов, однако я верю в правило, что каждая страница .cshtml должна иметь единственный класс модели.Это дает вам большую гибкость, когда вы хотите добавить новую логику в представление.Просто представьте себе простой случай, когда вы хотите добавить в свое частичное представление оператор if, который будет работать на основе некоторого значения, заданного в бэкэнде вашего приложения.В таком случае вам нужно будет использовать объекты ViewBag, ViewData для передачи его в представление, и это немного сложнее поддерживать, особенно если ваше приложение велико.В моем решении вы просто добавили бы это дополнительное поле к PersistantMessagesPartialModel, и даже в случае, если вы хотите сделать какое-то переименование и т. Д., Это просто быстрее и безопаснее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...