Ошибка создания RenderPartialAsync, проблема в контроллере? - PullRequest
1 голос
/ 14 апреля 2019

Имеется контроллер индекса, в котором я связываю данные из базы данных с представлением модели, а мое представление собирает данные пользователя и отображает их.И соответственно ниже я прикреплю PartialView

public class CustomerController : Controller
{
    private ICustomerRepository _customerRepository;
    public CustomerController(ICustomerRepository customerRepository)
    {
        _customerRepository = customerRepository;
    }
    [HttpGet]
    public IActionResult Index()
    {
      IEnumerable<CustomerViewModel> customers =
    _customerRepository.GetAllCustomers().Select(s => new
    CustomerViewModel
    {
        CustomerId = s.CustomerId,
        Name = s.Name,
        Adress = s.Adress
    });
        return View("Index", customers);
    }
    [HttpGet]
    public IActionResult Create()
    {
        return Redirect("Index");
    }
}

@model IEnumerable<CustomerViewModel>
<h2>Create Customer</h2>
@{
await Html.RenderPartialAsync("Create");
}
<table class="table">
@Html.DisplayNameFor(model => model.Name)
@foreach (var item in Model)
{
            @Html.DisplayFor(modelItem => item.Name)
}
</table>

Это сам PartialView:

@model CustomerViewModel
        <div class="col-md-4">
            <form asp-action="Create" asp-controller="Customer">

                <div class="form-group">
                    <label asp-for="Name" class="control-label"></label>
                    <input type="text" asp-for="Name" class="form-control" />
                </div>

При запуске приложения возникает ошибка:

InvalidOperationException:Элемент модели, передаваемый в ViewDataDictionary, имеет тип 'System.Linq.Enumerable + SelectEnumerableIterator` 2 [Store.DAL.Entity.Customer, Store.Web.ViewModels.CustomerViewModel]', но для этого экземпляра ViewDataDictionary требуется элемент модели типа 'Store.Web.ViewModels.CustomerViewModel

Если частичный просмотр размещен на отдельной странице, просто для создания ссылки на представление все будет отображаться и ошибки не будет.Может быть, все дело в том, как переопределить данные в контроллере для customerViewModel?Кто имел дело с этим?

1 Ответ

0 голосов
/ 14 апреля 2019

Что происходит

В вашем коде вы не предоставляете вашему View модель, которую он ожидает.

Если вы используете Html.RenderPartialAsync(viewName), вы автоматически передаете всю модель из основного вида в парциальный. Поскольку основной вид имеет тип модели IEnumerable<CustomerViewModel> - это то, что передается вашему частичному виду.

* Решения 1012 *

  1. Использовать отдельную страницу для создания объектов вместо повторного использования этой же страницы для отображения существующих
  2. Сделайте вашу модель более сложной, чтобы ее можно было использовать для обоих видов, и используйте перегрузку Html.RenderPartialAsync(string viewName, object model) для правильной передачи модели.

Для решения № 2 пример кода может быть:

Новый класс

public class CustomerListViewModel
{
    IEnumerable<CustomerViewModel> existingCustomers;
    CustomerViewModel newCustomer;
}

Контроллер

[HttpGet]
public IActionResult Index()
{
    IEnumerable<CustomerViewModel> customers =
    _customerRepository.GetAllCustomers().Select(s => new
    CustomerViewModel
    {
        CustomerId = s.CustomerId,
        Name = s.Name,
        Adress = s.Adress
    });
    CustomerListViewModel model = new CustomerListViewModel
    {
       existingCustomers = customers.AsEnumerable();
       newCustomer = new CustomerViewModel();
    }
    return View("Index", model);
}

Главный вид

@model CustomerListViewModel
<h2>Create Customer</h2>
@{
await Html.RenderPartialAsync("Create", Model.newCustomer);
}
<table class="table">
@foreach (var item in Model.existingCustomers)
{
   <tr>
       <td>@Html.DisplayFor(item => item.Name)</td>
   </tr>
}
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...