Как добавить поддержку контроллера (не просмотра) в серверный проект Blazor - PullRequest
2 голосов
/ 02 февраля 2020

Пока запущено мое приложение Blazor на стороне сервера, я хочу, чтобы какой-нибудь код Javascript в _Host.cshtml мог отправлять данные в действие контроллера. Конечно, это происходит совершенно за рамками самого приложения Blazor и не связано с ним.

Я думал, что это будет вопрос добавления вызовов к services.AddControllers() и endpoints.MapControllers() в соответствующих местах. в Startup.cs. Однако, выполнив это и реализовав действие контроллера, я сделал следующие наблюдения:

  • Запросы к действию не маршрутизируются и обрабатываются как «не найдены»
  • В Razor, @Url.Action в действии контроллера возвращает пустую строку

Как добавить поддержку контроллера (не просмотра) в мой серверный проект Blazor таким образом, чтобы преодолеть две вышеуказанные проблемы?

1 Ответ

2 голосов
/ 02 февраля 2020

Использование: endpoints.MapControllers ()

Вы можете иметь это в своем startup.cs:

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });

Этот контроллер:

[Route("api/[controller]")]
[ApiController]
public class DownloadController : Controller
{
    private readonly IWebHostEnvironment environment;
    public DownloadController(IWebHostEnvironment environment)
    {
        this.environment = environment;
    }

    [HttpGet("[action]")]
    public IActionResult DownloadFile(string FileName)
    {
        string path = Path.Combine(
                            environment.WebRootPath,
                            "files",
                            FileName);

        var stream = new FileStream(path, FileMode.Open);

        var result = new FileStreamResult(stream, "text/plain");
        result.FileDownloadName = FileName;
        return result;
    }
}

И это на вашей странице .razor:

@inject NavigationManager NavigationManager

<button @onclick="DownloadFile">Download</button>

@code {
     public void DownloadFile()
    {
        NavigationManager.NavigateTo($"/api/Download/DownloadFile?FileName=BlazorHelpWebsite.zip", true);
    }
}

См .: https://github.com/ADefWebserver/Blazor-Blogs/tree/master/BlazorBlogs

...