Skip to content

Blazor quickgrid error - The supplied expression can't be represented as a property name for sorting #62582

Open
@markat1

Description

@markat1

Is there an existing issue for this?

  • I have searched the existing issues

Describe the bug

I'm trying to send current chosen sort blazor quickgrid column to my backend.

So when I try to run the the following inside OnInitializedAsync I get an error on GetSortByProperties:

 public GridItemsProvider<TestEntity>? TestCallProvider { get; set; }

      TestCallProvider = async req =>
                {

                    var tq = req;

                    var sortColumn = req.GetSortByProperties();

                    if(req.GetSortByProperties().Any())
                    {
                        var propertyName = sortColumn?.FirstOrDefault().PropertyName; 
                        var direction = sortColumn?.FirstOrDefault().Direction;
                    }

Seems like it has issues with following property in my quickgrid:

  1. doesn't seem to like my TimeStamp
<DisplayNameColumn Property="@(p => p.TimeStamp)"
                           Format="dd.MM yy"
                           Sortable="true"
                           InitialSortDirection="SortDirection.Descending"
             
                           IsDefaultSortColumn="true">

which is as nulllable datetime:

  [Display(Name = "Tidspunkt")]
  public DateTime? TimeStamp { get; set; }

displaycolumn looks like this:

 public class DisplayNameColumn<TGridItem, TProp> : PropertyColumn<TGridItem, TProp>
 {
     //protected override void OnParametersSet()
     //{
     //    if (Title is null && Property.Body is MemberExpression memberExpression)
     //    {
     //        var memberInfo = memberExpression.Member;
     //        Title =
     //            memberInfo.GetCustomAttribute<DisplayNameAttribute>()?.DisplayName ??
     //            memberInfo.GetCustomAttribute<DisplayAttribute>()?.GetName() ??
     //            memberInfo.Name;
     //    }

     //    base.OnParametersSet();
     //}

     protected override void OnParametersSet()
     {
         if (Title is null)
         {
             MemberInfo? memberInfo = null;

             if (Property.Body is MemberExpression memberExpression)
             {
                 memberInfo = memberExpression.Member;
             }
             else if (Property.Body is UnaryExpression unaryExpression &&
                      unaryExpression.Operand is MemberExpression unaryMember)
             {
                 memberInfo = unaryMember.Member;
             }

             if (memberInfo != null)
             {
                 Title =
                     memberInfo.GetCustomAttribute<DisplayNameAttribute>()?.DisplayName ??
                     memberInfo.GetCustomAttribute<DisplayAttribute>()?.GetName() ??
                     memberInfo.Name;
             }
         }

         base.OnParametersSet();
     }
 }

Expected Behavior

All I want is the name as string of the column that it current sorting on, with no issues.

Exception

Error I receive is the following issue:

Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
      Unhandled exception rendering component: The supplied expression can't be represented as a property name for sorting. Only simple member expressions, such as @(x => x.SomeProperty), can be converted to property names.
System.ArgumentException: The supplied expression can't be represented as a property name for sorting. Only simple member expressions, such as @(x => x.SomeProperty), can be converted to property names.
   at Microsoft.AspNetCore.Components.QuickGrid.GridSort`1[[TestProject.Client.Models.TestModelEntity, TestProject.Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].ToPropertyName(LambdaExpression expression)
   at Microsoft.AspNetCore.Components.QuickGrid.GridSort`1[[TestProject.Client.Models.TestModelEntity, TestProject.Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].BuildPropertyList(Boolean ascending)
   at Microsoft.AspNetCore.Components.QuickGrid.GridSort`1[[TestProject.Client.Models.TestModelEntity, TestProject.Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].ToPropertyList(Boolean ascending)
   at Microsoft.AspNetCore.Components.QuickGrid.GridItemsProviderRequest`1[[TestProject.Client.Models.TestModelEntity, TestProject.Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].GetSortByProperties()
   at TestProject.Client.Pages.TestPage.<OnInitializedAsync>b__16_0(GridItemsProviderRequest`1 req) in C:\TestFolder\TestProject\TestProject\TestProject.Client\Pages\TestPage.razor.cs:line 36
   at Microsoft.AspNetCore.Components.QuickGrid.QuickGrid`1.<ResolveItemsRequestAsync>d__83[[TestProject.Client.Models.TestModelEntity, TestProject.Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext()
   at Microsoft.AspNetCore.Components.QuickGrid.QuickGrid`1.<RefreshDataCoreAsync>d__81[[TestProject.Client.Models.TestModelEntity, TestProject.Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext()
   at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
   at Microsoft.AspNetCore.Components.QuickGrid.Infrastructure.EventCallbackSubscribable`1.<InvokeCallbacksAsync>d__1[[System.Object, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext()

.NET Version & application

Blazor
.net 9.0

Metadata

Metadata

Assignees

Labels

area-blazorIncludes: Blazor, Razor Components

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions