如何在 Blazor 中使用路由发送日期时间

How to send datetime with route in Blazor

我正在尝试为我的一个发送日期时间的 Blazor 网页创建路由。根据其支持的文档,但我似乎无法使其正常工作。我是这样做的。

我想去的地方:

@page "/routeTest/{number:int}/{date:datetime}"

@code {       
    [Parameter] public int number { get; set; }
    [Parameter] public DateTime date { get; set; }
}

我是如何尝试导航到那里的

NavigationManager.NavigateTo("routeTest/"+numberToSend+"/"+dateToSend);

它带我去

https://localhost:44383/routeTest/123/12/11/2019%204:36:26%20PM

虽然从技术上讲是正确的,但我很确定这是 dateTime 对象的错误。我应该如何才能正确发送 dateTime 对象?

如您所见,URL 中的日期时间因斜杠而影响路由。

以 ISO8601 格式发送 DateTime yyyy-MM-ddTHH:mm:ss

您可以使用:

dateToSend.ToString("s", System.Globalization.CultureInfo.InvariantCulture)

其中格式说明符 s 称为 Sortable date/time pattern

或者

dateToSend.ToString("yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture)

使用 InvariantCulture 因为 Blazor routing 页面声明:

Route constraints that verify the URL and are converted to a CLR type (such as int or DateTime) always use the invariant culture. These constraints assume that the URL is non-localizable.

问题是您的语言日期使用斜杠分隔符,这让 Blazor 认为您正在尝试访问不同的路径。

无论何时将日期作为 URL 参数发送,它们都需要采用不变的文化并使用破折号。

NavigationManager.NavigateTo("routeTest/"+numberToSend+"/"+dateToSend.ToString("yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture));

作为参考,请参阅 official documentation

中的警告

这可以解决您的问题:

@code{
    int numberToSend = 123;
    string dateToSend = DateTime.Now.ToString("yyyy-MM-dd");

    private void Naviagte()
    {
        NavigationManager.NavigateTo("routeTest/" + numberToSend + "/" + dateToSend);
    }

}