c# - 验证 Blazor 中的 URL 参数并使用 404 响应

标签 c# blazor blazor-server-side

我正在尝试验证 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/

相关文章:

Blazor 服务器 - 静态文件不会在非 DEV 环境中链接

c# - 套接字:将字符串从 Java 发送到 C#?

c# - 是否可以为 wp7 应用程序选择电话设置时间格式

c# - 我可以在同一个 Web 应用程序中有 2 个(或更多)不同的 ASP.NET Core 编程模型吗?

c# - 如何将输入值绑定(bind)到 Blazor 中的对象属性

c# - VS 2017 .Net core 2.2 中缺少 Blazor 模板

c# - 如何为 WP8 sqlite-net 进行 'raw' 查询

c# - SqlDataSource UpdateCommand 参数未更改

azure - 应用程序服务上的 httpcontextaccessor 空引用,但不进行调试

c# - Blazor 替代 JS window.location.href