ViewComponent возвращается, но модель имеет значение null при использовании значения маршрута

Все еще новичок в razorpages и viewcomponents, но несколько раз обходил блокировку с asp.net

Не уверен, почему у моего компонента просмотра не заполнена модель. Одна вещь, которую я заметил, что я сделал, что неправильно, это поместил параметр маршрута вверху,
например.

@page "{handler?}"

Я знаю (по крайней мере, сейчас), что ViewComponents не предназначены для прямой маршрутизации в качестве конечных точек, но теперь мне любопытно, что делает использование @page с атрибутом маршрута, чтобы предотвратить привязку модели? Я обнаружил только методом проб / ошибок, что удаление этого позволяет моей модели заполнять ViewComponent.

Вот код

ViewComponent

public class TestViewComponent : ViewComponent
{

    public async Task<IViewComponentResult> InvokeAsync(Data.CustomerListModel cust)
    {
        List<Data.CustomerListModel> clist = new List<Data.CustomerListModel>();
        clist.Add(new Data.CustomerListModel() { Customer = "fred" });
        clist.Add(new Data.CustomerListModel() { Customer = "wilma" });

        var dlist = clist.AsEnumerable();

        return View(dlist);
    }
}

Просмотр для ViewComponent, Default.html

@page "{handler?}"
@using System.Collections.Generic
@addTagHelper *, TelerikAspnetCoreApp1
@model IEnumerable<Data.CustomerListModel>

<h1>Default</h1>

<h3>Machine name @Environment.MachineName</h3>
<ul>
    @foreach (Data.CustomerListModel c in Model)
    {
        <li>@c.Customer</li>
    }
</ul>

CustomerListModel

namespace TelerikAspNetCoreApp1.Data
{
    public class CustomerListModel
    {
        public string Customer { get; set; }
    }
}

Родительское представление, Index.cshtml

<div>
    @await Component.InvokeAsync("Test",new { Name = "tester123" })
</div>

3 ответа

Решение

Представление ViewComponent очень похоже на файл представления Razor, используемый в приложении ASP.NET Core с контроллерами и представлениями. потом@page Директива используется на странице Razor и превращает файл в действие MVC, что означает, что он обрабатывает запросы напрямую, без прохождения через контроллер. @page влияет на поведение других конструкций Razor.

Вы можете выделить время, чтобы прочитать документацию MS о View Component и Razor Pages:

https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components?view=aspnetcore-3.0

https://docs.microsoft.com/en-us/aspnet/core/razor-pages/?view=aspnetcore-3.0&tabs=visual-studio

Не использовать @page на странице, которую вы хотите выполнить return View(<page_name>, <model>) и Model свойство больше не будет нулевым.

У меня просто была похожая проблема. Мне стыдно, потому что это была жестокая ошибка новичка. Моя ошибка заключалась в том, что объекты, которые я отправлял и получал соответственно, были разными. У меня был cshtml:

      @if (Model is IHasBanner {HasMessage: true } model)
{
    @await Component.InvokeAsync("MessageArea", model)
}

Затем в моем ViewComponent у меня было:

      public async Task<IViewComponentResult> InvokeAsync(Banner banner)
    => this.View("Default", banner);

И, на мой взгляд, у меня было:

      @if (Model is IHasBanner {HasMessage: true} model)
{
    message = model.Banner.Text;
}

Так что бардак был идеальным!

Вот почему вы должны обращать внимание на то, с какими объектами вы работаете во время реализации! Что дано, что получено. Я был удивлен, что моя модель была нулевой в представлении, но это было просто результатом моего собственного замешательства.

Другие вопросы по тегам