如何向服务器端 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()
的调用。但是,在执行此操作并执行控制器操作之后,我进行了以下观察:
@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 添加到现有 MVC Core 应用程序