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

Posted

技术标签:

【中文标题】如何向服务器端 Blazor 项目添加控制器(而非视图)支持【英文标题】:How to add controller (not view) support to a server-side Blazor project 【发布时间】:2020-05-18 05:20:55 【问题描述】:

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

我认为这需要在Startup.cs 的适当位置添加对services.AddControllers()endpoints.MapControllers() 的调用。但是,在执行此操作并执行控制器操作之后,我进行了以下观察:

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

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

【问题讨论】:

请发表您的尝试 【参考方案1】:

使用: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

【讨论】:

这就是我一直在做的事情,但我只是注意到,通过使用MapControllers(),在浏览器中输入与 Blazor 路由对应的 url 不再有效,我只能从主页。知道如何解决这个问题吗? 好的,我已经解决了我的问题。我的结论是:由于某种未知原因,如果我在同一个控制器类中有“混合路由”(比如操作方法有不同的根路径),那么 MapControllers() 会以某种方式导致 Blazor 路由停止工作(我不知道为什么)。我重新组织了我的控制器和操作,问题就解决了。超级奇怪。

以上是关于如何向服务器端 Blazor 项目添加控制器(而非视图)支持的主要内容,如果未能解决你的问题,请参考以下文章

Blazor(服务器端)在同级组件之间进行通信

将服务器端 Blazor 添加到现有 MVC Core 应用程序

除了 dbContext 之外,如何向 Blazor 中的服务添加参数?

在服务器端 Blazor 项目中搭建标识时出错

Blazor 服务器 api 返回文本/html

自定义脚本在 Blazor 服务器端工作错误