【问题标题】:How to set new value to existing query string Blazor如何为现有查询字符串 Blazor 设置新值
【发布时间】:2020-10-19 05:33:29
【问题描述】:

我正在尝试更改查询字符串参数而不重新加载页面。我有一个 DateTime 日期值,我试图将其转换为字符串并放入 url。说,为了这个问题,它是:

DateTime? Date = new DateTime(2020, 9, 4);

所以,我的网址可能看起来像:

https://localhost:44346/Events?d=2020-10-18

在我做了必须做的任何魔法之后,结果如下:

https://localhost:44346/Events?d=2020-10-04

我曾尝试使用NavigationManagerQueryHelpers,如下所示,但我没有运气:

QueryHelpers.AddQueryString(navManager.Uri, "d", Date?.ToString("yyyy-MM-dd"));

【问题讨论】:

  • 你能描述一下“没有运气”吗?我认为 navManager.Uri 已经有一个查询字符串。
  • 没有运气"" 在那种情况下意味着它不起作用。 navManager.Uri 等于 "localhost:44346/Events?d=2020-10-18" 所以它已经有一个查询字符串。但是,当我改用navManager.ToAbsoluteUri("Events").ToString() 尝试它时,它仍然不起作用
  • 你确实有[Parameter] d,对吧?
  • 不,我不知道,[Parameter] d 只有在https://localhost:44346/Events/2020-10-04 的形式下才有效。我在获取当前查询字符串时没有任何问题,只需设置它即可。
  • 不,参数也可以与 ?d= 一起使用。但是你想创建一个 <a> 还是使用 NavigateTo() ?这可能很重要。导航到同一页面时出现问题,找不到这么快。

标签: asp.net-core url query-string blazor


【解决方案1】:

请查看此演示

@page "/counter"
@using Microsoft.AspNetCore.WebUtilities
@using System.Web 
@inject NavigationManager navManager

<button class="btn btn-primary" @onclick="ChangeUrl">Change url</button>
<br />
demonstrate lack of page reload
<br />
<button class="btn btn-primary" @onclick="AddItem">Add item</button>
@foreach (var item in list)
{
    @item
}

@code {

    private List<string> list = new List<string>()
    {
        "Test string"
    };

    private void AddItem()
    {
        var uri = navManager.ToAbsoluteUri(navManager.Uri);

        if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("d", out var param))
        {
            list.Add(param.First());
        }
        else
        {
            list.Add("d is empty");
        }
    }

    DateTime dateCounter = DateTime.Today;
    private void ChangeUrl()
    {
        dateCounter = dateCounter.AddDays(1);

        string url = RemoveQueryStringByKey(navManager.Uri, "d");
        var query = new Dictionary<string, string> { { "d", dateCounter.ToString("dd-MM-yyyy") } };

        navManager.NavigateTo(QueryHelpers.AddQueryString(url, query));
    }

    public static string RemoveQueryStringByKey(string url, string key)
    {
        var uri = new Uri(url);

        // this gets all the query string key value pairs as a collection
        var newQueryString = HttpUtility.ParseQueryString(uri.Query);

        // this removes the key if exists
        newQueryString.Remove(key);

        // this gets the page path from root without QueryString
        string pagePathWithoutQueryString = uri.GetLeftPart(UriPartial.Path);

        return newQueryString.Count > 0
            ? String.Format("{0}?{1}", pagePathWithoutQueryString, newQueryString)
            : pagePathWithoutQueryString;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2012-01-06
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多