public void RejectsUnsupportedType() { var ex = Assert.Throws <NotSupportedException>( () => QueryParameterValueSupplier.ForType(typeof(UnsupportedType))); Assert.Equal("Querystring values cannot be parsed as type 'System.Object'.", ex.Message); }
public void CannotMapSingleQueryParameterToMultipleProperties() { var ex = Assert.Throws <InvalidOperationException>( () => QueryParameterValueSupplier.ForType(typeof(MapSingleQueryParameterToMultipleProperties))); Assert.Contains("declares more than one mapping for the query parameter 'a'.", ex.Message, StringComparison.OrdinalIgnoreCase); }
private void RenderPageWithParameters(RenderTreeBuilder builder) { builder.OpenComponent(0, RouteData.PageType); foreach (var kvp in RouteData.RouteValues) { builder.AddAttribute(1, kvp.Key, kvp.Value); } var queryParameterSupplier = QueryParameterValueSupplier.ForType(RouteData.PageType); if (queryParameterSupplier is not null) { // Since this component does accept some parameters from query, we must supply values for all of them, // even if the querystring in the URI is empty. So don't skip the following logic. var url = NavigationManager.Uri; ReadOnlyMemory <char> query = default; var queryStartPos = url.IndexOf('?'); if (queryStartPos >= 0) { var queryEndPos = url.IndexOf('#', queryStartPos); query = url.AsMemory(queryStartPos..(queryEndPos < 0 ? url.Length : queryEndPos)); } queryParameterSupplier.RenderParametersFromQueryString(builder, query); } builder.CloseComponent(); }
/// <summary> /// BuildRenderTree 方法 /// </summary> /// <param name="builder"></param> protected override void BuildRenderTree(RenderTreeBuilder builder) { // 判断是否开启权限 if (Authorized && Type != null) { var index = 0; builder.OpenComponent(index++, Type); foreach (var kv in (Parameters ?? new ReadOnlyDictionary <string, object>(new Dictionary <string, object>()))) { builder.AddAttribute(index++, kv.Key, kv.Value); } #if NET6_0_OR_GREATER BuildQueryParameters(); #endif builder.CloseComponent(); } else { builder.AddContent(0, NotAuthorized); } #if NET6_0_OR_GREATER void BuildQueryParameters() { var queryParameterSupplier = QueryParameterValueSupplier.ForType(Type); if (queryParameterSupplier is not null) { // Since this component does accept some parameters from query, we must supply values for all of them, // even if the querystring in the URI is empty. So don't skip the following logic. var url = NavigationManager.Uri; var queryStartPos = url.IndexOf('?'); var query = queryStartPos < 0 ? default : url.AsMemory(queryStartPos); queryParameterSupplier.RenderParametersFromQueryString(builder, query); } } #endif }
public void ComponentWithNoQueryParametersHasNoSupplier() { Assert.Null(QueryParameterValueSupplier.ForType(typeof(NoQueryParameters))); }