如何向服务器端 Blazor 项目添加控制器(而非视图)支持

Pan*_*ake 12 c# .net-core asp.net-core blazor blazor-server-side

当我的服务器端 Blazor 应用程序运行时,我希望一些 Javascript 代码_Host.cshtml能够将数据发布到控制器操作。当然,这完全超出了 Blazor 应用程序本身的范围,并且与 Blazor 应用程序本身无关。

我想这将是添加调用的问题services.AddControllers(),并endpoints.MapControllers()在适当的地方Startup.cs。但是,在执行此操作并实施控制器操作之后,我进行了以下观察:

  • 对操作的请求不会被路由并被视为“未找到”
  • 在 Razor 中,@Url.Action控制器操作返回一个空字符串

如何以克服上述两个问题的方式向我的服务器端 Blazor 项目添加控制器(而非视图)支持?

Mic*_*ton 22

使用:endpoints.MapControllers()

你可以在你的startup.cs中有这个:

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });
Run Code Online (Sandbox Code Playgroud)

这个控制器:

[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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这在您的 .razor 页面中:

@inject NavigationManager NavigationManager

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

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

请参阅:https : //github.com/ADefWebserver/Blazor-Blogs/tree/master/BlazorBlogs

  • 好的,我已经解决了我的问题。我的结论是:出​​于某种未知的原因,如果我在同一个控制器类内有“混合路由”(假设操作方法具有不同的根路径),那么“MapControllers()”会以某种方式导致 Blazor 路由停止工作(并且我有不知道为什么)。我重新组织我的控制器和操作,问题就解决了。超级奇怪。 (2认同)