我正在尝试验证 Blazor 服务器端页面中的 URL。参数值必须是枚举中的值。如果 URL 值不是枚举值之一,我想返回 HTTP 响应 404。
我意识到 Blazor 处理内容的方式与普通 ASP.NET 有点不同,所以我什至不确定这是否可行。我设法找到的示例全部导航到“未找到”页面。这可能可行,但我更喜欢 404 错误。
这是一个例子来说明我想要做什么。
page "/{Value?}"
<h1>@ParsedValue.ToString()</h1>
@code {
[Parameter]
public string Value { get; set; }
public MyEnum ParsedValue { get; private set; }
protected override void OnParametersSet()
{
if (!string.IsNullOrEmpty(Value))
{
MyEnum parsedValue;
if (!Enum.TryParse<MyEnum>(Value, out parsedValue))
{
// return 404 not found
}
ParsedValue = parsedValue;
}
base.OnParametersSet();
}
public enum MyEnum
{
Apples,
Oranges,
Bananas
}
}
最佳答案
您可以导航到 404 页面。
在您的组件中,您可以将 NavigateTo 与 forceLoad 选项一起使用 - 这可以避免 Blazor 路由器。
@inject NavigationManager navman
@page "/{Value?}"
<h1>@ParsedValue.ToString()</h1>
@code {
[Parameter]
public string Value { get; set; }
public MyEnum ParsedValue { get; private set; }
protected override void OnParametersSet()
{
if (!string.IsNullOrEmpty(Value))
{
MyEnum parsedValue;
if (!Enum.TryParse<MyEnum>(Value, out parsedValue))
{
navman.NavigateTo($"404?{navman.Uri}",true);
}
ParsedValue = parsedValue;
}
base.OnParametersSet();
}
public enum MyEnum
{
Apples,
Oranges,
Bananas
}
}
然后在startup.cs中映射一个端点来处理404路由
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.Map("404", rq =>
{
rq.Response.StatusCode = 404;
rq.Response.WriteAsync(Get404(rq.Request.QueryString.ToString().Substring(5)));
return Task.CompletedTask;
});
endpoints.MapFallbackToPage("/_Host");
});
string Get404(string url)
{
return $@"
<h1>404 - Page not found</h1>
<p>{url}</p>
<a href=""/"">Home</a>
";
}
如果您希望 Razor 页面处理 404 消息的显示而不是实际的 404 状态响应,您还可以使用 app.UseStatusCodePagesWithRedirects
将该 404 重定向到实际的 Razor 页面/ View 让事情变得漂亮 - 但你可以在 Blazor SPA 中拥有它,所以我怀疑你想要这样 - 你确实要求一个真正的 404。
关于c# - 验证 Blazor 中的 URL 参数并使用 404 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68225010/