我正试图按照这里的建议从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的博客这里
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
将保存您可以使用的查询参数名称。