Можно ли обновить 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

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