How to use Kendo UI Grid with ToDataSourceResult(), IQueryable, ViewModel and AutoMapper?

前端 未结 6 1656
轻奢々
轻奢々 2021-02-02 01:00

What is the best approach to load/filter/order a Kendo grid with the following classes:

Domain:

public class Car
{
    public virtual in         


        
6条回答
  •  暗喜
    暗喜 (楼主)
    2021-02-02 01:27

    I don't like the way Kendo has implemented "DataSourceRequestAttribute" and "DataSourceRequestModelBinder", but thats another story.

    To be able to filter/sort by VM properties which are "flattened" objects, try this:

    Domain model:

    public class Administrator
    {
        public int Id { get; set; }
    
        public int UserId { get; set; }
    
        public virtual User User { get; set; }
    }
    
    public class User
    {
        public int Id { get; set; }
    
        public string UserName { get; set; }
    
        public string Email { get; set; }
    }
    

    View model:

    public class AdministratorGridItemViewModel
    {
        public int Id { get; set; }
    
        [Displaye(Name = "E-mail")]
        public string User_Email { get; set; }
    
        [Display(Name = "Username")]
        public string User_UserName { get; set; }
    }
    

    Extensions:

    public static class DataSourceRequestExtensions
    {
        /// 
        /// Enable flattened properties in the ViewModel to be used in DataSource.
        /// 
        public static void Deflatten(this DataSourceRequest dataSourceRequest)
        {
            foreach (var filterDescriptor in dataSourceRequest.Filters.Cast())
            {
                filterDescriptor.Member = DeflattenString(filterDescriptor.Member);
            }
    
            foreach (var sortDescriptor in dataSourceRequest.Sorts)
            {
                sortDescriptor.Member = DeflattenString(sortDescriptor.Member);
            }
        }
    
        private static string DeflattenString(string source)
        {
            return source.Replace('_', '.');
        }
    }
    

    Attributes:

    [AttributeUsage(AttributeTargets.Method)]
    public class KendoGridAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
    
            foreach (var sataSourceRequest in filterContext.ActionParameters.Values.Where(x => x is DataSourceRequest).Cast())
            {
                sataSourceRequest.Deflatten();
            }
        }
    }
    

    Controller action for Ajax data load:

    [KendoGrid]
    public virtual JsonResult AdministratorsLoad([DataSourceRequestAttribute]DataSourceRequest request)
        {
            var administrators = this._administartorRepository.Table;
    
            var result = administrators.ToDataSourceResult(
                request,
                data => new AdministratorGridItemViewModel { Id = data.Id, User_Email = data.User.Email, User_UserName = data.User.UserName, });
    
            return this.Json(result);
        }
    

提交回复
热议问题