ASP .NET Core Razor: Связанные с моделью сложные типы не должны быть абстрактными или значениями и должны иметь конструктор без параметров - PullRequest
0 голосов
/ 30 апреля 2019

Если у меня есть свойство, подобное этому в моей модели:

    [BindProperty]
    public IPagedList<Product> Products { get; set; }

, то, когда я пытаюсь опубликовать сообщение, я получаю эту ошибку:

An unhandled exception occurred while processing the request.
InvalidOperationException: Could not create an instance of type 'X.PagedList.IPagedList`1[Data.Models.Product, Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. Model bound complex types must not be abstract or value types and must have a parameterless constructor. Alternatively, set the 'Products' property to a non-null value in the 'Areas.Catalog.Pages.ProductListModel' constructor.

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

Products = new PagedList<Product>(Enumerable.Empty<Product>(), 1, 10);

Но я получаю ту же ошибку.

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Когда я удаляю [BindProperty], он работает. У меня сложилось впечатление, что мне нужно это связать свойство на странице Razor, но, наверное, нет?

0 голосов
/ 03 мая 2019

Если создан новый проект Razor Pages и сделаны следующие исправления, он работает нормально:

Product.cs:

public class Product
{
    public int Id { get; set; }

    public string Name { get; set; }
}

Index.cshtml:

@page
@using X.PagedList;
@using X.PagedList.Mvc.Core;

@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>


@{ 


    foreach (var item in Model.Products)
    {

        <div> @item.Name</div>

    }

}


@Html.PagedListPager((IPagedList)Model.Products, page => Url.Action("Index", new { page }))

Index.cshtml.cs

public class IndexModel : PageModel
{

    public IndexModel()
    {
        Products = new PagedList<Product>(Enumerable.Empty<Product>(), 1, 10);
    }


    [BindProperty]
    public IPagedList<Product> Products { get; set; }


    public void OnGet()
    {

    }
}

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

Чтобы убедиться в этом, используйте временный простой класс Product (как в моем примере) в качестве теста.

После подтверждения попробуйте проецировать класс продукта в более простой класс с помощью Automapper или метода Select linq и посмотрите,помогает:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/basic-linq-query-operations#selecting-projections

http://docs.automapper.org/en/stable/Projection.html

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