问题描述
我正在尝试从建议的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
将保存您可以使用的查询参数名称。