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;
}
Так что бардак был идеальным!
Вот почему вы должны обращать внимание на то, с какими объектами вы работаете во время реализации! Что дано, что получено. Я был удивлен, что моя модель была нулевой в представлении, но это было просто результатом моего собственного замешательства.