Можно ли обновить ViewComponent на бритвенной странице asp.net core 2.1?
Я обнаружил, что это можно сделать в asp.net MVC с использованием Ajax, см. Решения здесь. Альтернатива Viewcomponent для обновления ajax и здесь ViewComponents не являются асинхронными.
Одно из решений, которое я нашел, заключается в том, чтобы контроллер возвращал ViewComponent, а затем использовал Ajax для обновления.
Этот пример заимствован у ViewComponents не асинхронных
~ / HelloWorldViewComponent.cs
public class HelloWorldViewComponent : ViewComponent
{
public IViewComponentResult Invoke()
{
var model = new string[]
{
"Hello", "from", "the", "view", "component."
};
return View("Default", model);
}
}
~ / HomeController.cs (я не могу заставить эту часть работать на страницах бритвы)
public class HomeController : Controller
{
public IActionResult GetHelloWorld()
{
return ViewComponent("HelloWorld");
}
}
~ / Views / Shared / Компоненты / HelloWorld / Default.cshtml
@model string[]
<ul>
@foreach(var item in Model)
{
<li>@item</li>
}
</ul>
~ / Wwwroot/index.html
<body>
<script src="js/jquery.min.js"></script>
<script>
$.get("home/GetHelloWorld", function(data) {
$("body").html(data);
});
</script>
</body>
Моя проблема в том, что я не могу заставить контроллер работать вместе с Razor Pages, я не могу понять, возможно ли это вообще.
1 ответ
TLDR
Откройте Startup.cs и замените это
app.UseMvc();
с этим
app.UseMvcWithDefaultRoute();
подробности
Шаблон ASP.NET Core Razor Pages (dotnet new razor
) не идет с маршрутами контроллера, потому что это не идет с контроллерами. Самый простой способ добавить маршруты контроллера через UseMvcWithDefaultRoute()
, что эквивалентно следующему:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
При установленном маршруте URL ~/Home/GetHelloWorld
карты к HomeController.GetHelloWorld()
действие.
Вот коммит GitHub, который демонстрирует ваш вариант использования в новом приложении ASP.NET Core Razor Pages.
Смотрите также
https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.1
Чтобы сделать это в RazorPage, убедитесь, что метод обработчика следует соглашению OGet[MyMethodName], и это должно решить вашу проблему с маршрутизацией.
public class HomeController : Controller
{
public IActionResult OnGetHelloWorld()
{
return ViewComponent("HelloWorld");
}
}
И измените запрос на получение, чтобы использовать обработчик
<body>
<script src="js/jquery.min.js"></script>
<script>
$.get(window.location.href.split('?')[0] + "?handler=HelloWorld", function(data) {
$("body").html(data);
});
</script>
</body>
Различные примеры доступны по ссылке https://docs.microsoft.com/en-us/aspnet/core/razor-pages/?view=aspnetcore-3.1&tabs=visual-studio