导航管理器NullReferenceException

问题描述

我正在尝试从建议的here的URL获取查询字符串,但是却收到了NullReferenceException。我的代码和链接的文章中的代码之间的唯一区别是,我的代码是静态的,我不知道这怎么可能导致错误。

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]进入静态类。 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将保存您可以使用的查询参数名称。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...