【问题标题】:Navigation Manager NullReferenceException导航管理器 NullReferenceException
【发布时间】:2020-09-06 07:18:11
【问题描述】:

我正在尝试按照建议的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");
 }

【问题讨论】:

  • 旁注:你想要 || ,而不是布尔逻辑中的 |

标签: c# dependency-injection blazor nullreferenceexception


【解决方案1】:

您不能将@inject[Inject] 放入静态类。 MyNavigationManager 属性永远不会被分配给。

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

【讨论】:

    【解决方案2】:

    这是我用来获取查询参数的扩展方法。我从 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 将保存您可以使用的查询参数名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 2020-10-15
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多