导航管理器 NullReferenceException

Navigation Manager NullReferenceException

我正在尝试按照 here 的建议从 URL 获取查询字符串,但我收到了 NullReferenceException。我的代码和链接 post 中的代码之间的唯一区别是我的代码是静态的,我不明白这怎么会导致错误。

public static class Extensions
    {
        //Other helper methods

        [Inject]
        public static NavigationManager MyNavigationManager { get; set; }

        public static string GetQueryParm(string parmName)
        {
            //Null Reference Exception is called on the line below
            var uriBuilder = new UriBuilder(MyNavigationManager.Uri);           
            var q = System.Web.HttpUtility.ParseQueryString(uriBuilder.Query);
            return q[parmName] ?? "";
        }
    }

我这样调用这个方法:

 else if (date == null | string.IsNullOrWhiteSpace(Extensions.GetQueryParm("d")))
 {
     date = DateTime.Today.ToString("yyyy-MM-dd");
 }

您不能 @inject[Inject] 进入静态 class。 MyNavigationManager 属性 永远不会分配给。

所以忘记将其作为扩展方法并将其注入您的 blazor 页面。

这是我用来获取查询参数的扩展方法。这是我从 Chris Sainty 的博客 here

中截取的
public static class NavigationManagerExtensions
{
    public static bool TryGetQueryString<T>(this NavigationManager navManager, string key, out T value)
    {
        var uri = navManager.ToAbsoluteUri(navManager.Uri);

        if (QueryHelpers.ParseQuery(uri.Query).TryGetValue(key, out var valueFromQueryString))
        {
            if (typeof(T) == typeof(int) && int.TryParse(valueFromQueryString, out var valueAsInt))
            {
                value = (T)(object)valueAsInt;
                return true;
            }

            if (typeof(T) == typeof(string))
            {
                value = (T)(object)valueFromQueryString.ToString();
                return true;
            }

            if (typeof(T) == typeof(decimal) && decimal.TryParse(valueFromQueryString, out var valueAsDecimal))
            {
                value = (T)(object)valueAsDecimal;
                return true;
            }

            if (typeof(T) == typeof(Guid) && Guid.TryParse(valueFromQueryString, out var valueAsGuid))
            {
                value = (T)(object)valueAsGuid;
                return true;
            }

            if (typeof(T) == typeof(bool) && bool.TryParse(valueFromQueryString, out var valueAsBool))
            {
                value = (T)(object)valueAsBool;
                return true;
            }
        }

        value = default;
        return false;
    }
}

你可以这样使用它:

// for example you have this URL: /page/action?showPromo=true

_navigationManager.TryGetQueryString<bool>("showPromo", out bool _showPromo);

_showPromo 将包含您可以使用的查询参数名称。