MvcContrib Grid对复杂对象进行排序 [英] MvcContrib Grid Sorting on complex object

查看:121
本文介绍了MvcContrib Grid对复杂对象进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 MvcContrib 网格控件。但我似乎无法使用排序来处理包含其他对象的复杂对象。



我在这个问题中设置了类似于OP的控制器/类/视图。
用MVCContrib排序



我试图使用SortColumnName到我的childobject.property,但它给了我一个错误,说我的主要对象没有这个属性。这是我的代码片段



// POCO class

  class Issue {
public int ID {get;得到; }
.....
public int priorityId {get; set;}
public virtual Priority priority {get;设置;}
}

//控制器代码

  public ViewResult Index(int?pageNo,GridSortOptions sort)
{
var issues = db.issues.Include(i => i。优先);
ViewBag.sort = sort;

if(!string.IsNullOrEmpty(sort.Column))
{
issues = issues.OrderBy(sort.Column,sort.Direction);
}
return View(issues.ToList()。AsPagination(pageNo ?? 1,10));

$ / code>

//查看网格代码

  @ Html.Grid(Model).Sort(ViewBag.sort as GridSortOptions).Columns(column => {
column.For(issue => gt ; Html.ActionLink(,Edit,new {id = issue.ID,areas =Issues,controller =Main},new {@ id =editBtn}))。Named(Edit );
column.For(issue => Html.ActionLink(issue.ID.ToString(),Edit,new {id = issue.ID,areas =Issues,controller =Main}) ))。Named(ID)。Sortable(true);
column.For(issue => issue.priority.codeDesc).Named(Priority)。SortColumnName(priority.codeDesc)。 Sortable(true);
})。Empty(找不到数据)

我尝试排序优先级字符串,它给了我一个错误,说'priority.codeDesc不是问题的属性'。

TIA

解决方案

该网格,而是作为MvcContrib排序扩展的一部分提供的.OrderBy扩展方法。这个扩展是相当简单的,我只写了它来覆盖你想要对对象的直接属性进行排序的简单情况,但是在你的情况下,你试图在嵌套属性(priority.codeDesc)上进行排序, 't不支持 - 你不能在这个扩展名中使用点符号。



你需要切换到使用不同的机制来执行实际的排序,或者如果这是一种一次性的情况,那么你可以硬编码这个特定列的排序逻辑(不理想,但如果它是一个关闭那么它比编写一个新的排序机制更简单),例如:

  if(!string.IsNullOrEmpty(sort.Column))
{
if(sort.Column ==priority.codeDesc )
{
issues = issues.OrderBy(x => x.priority.codeDesc);
}
else
{
issues = issues.OrderBy(sort.Column,sort.Direction);
}
}


I am trying to work with MvcContrib Grid control. But I cannot seem to get the sorting to work on complex objects that hold other objects.

I have setup my controller/classes/Views similar to the OP in this question. Sorting with MVCContrib

I have tried to use the SortColumnName to my childobject.property but it gives me an error saying My main object does not have this property. This is my code snippet

//POCO class

class Issue {
   public int ID {get; get; }
   .....
   public int priorityId {get; set;}
   public virtual Priority priority {get; set;}
}

//Controller code

    public ViewResult Index(int? pageNo, GridSortOptions sort)
    {
        var issues = db.issues.Include(i => i.priority);
        ViewBag.sort = sort; 

        if (!string.IsNullOrEmpty(sort.Column))
        {
            issues = issues.OrderBy(sort.Column, sort.Direction);
        }
        return View(issues.ToList().AsPagination(pageNo ?? 1, 10));
    }

//View code for the Grid

@Html.Grid(Model).Sort(ViewBag.sort as GridSortOptions).Columns(column => {
    column.For(issue => Html.ActionLink(" ", "Edit", new { id = issue.ID, areas = "Issues", controller = "Main"}, new { @id="editBtn"})).Named("Edit");
    column.For(issue => Html.ActionLink(issue.ID.ToString(), "Edit", new {id = issue.ID, areas = "Issues", controller = "Main"})).Named("ID").Sortable(true);
     column.For(issue => issue.priority.codeDesc).Named("Priority").SortColumnName("priority.codeDesc").Sortable(true);
}).Empty("No data found")

When I try to sort on the priority string, it gives me an error saying 'priority.codeDesc is not a property of Issue'.

TIA

解决方案

The issue here isn't actually related to the grid, but rather to the .OrderBy extension method provided as part of the MvcContrib sorting extensions. This extension is fairly simplistic and I only wrote it to cover simple cases where you want to sort on a direct property of the object, however in your case you're trying to order on a nested property ("priority.codeDesc") which isn't supported - you can't use dot notation with this extension.

You'd either need to switch to using a different mechanism to perform the actual sorting, or if this is a one-off situation then you could hard-code the sorting logic for this particular column (not ideal, but if it's a one off then it's simpler than writing a new sorting mechanism), eg:

if (!string.IsNullOrEmpty(sort.Column))
{
    if(sort.Column == "priority.codeDesc") 
    {
        issues = issues.OrderBy(x => x.priority.codeDesc);
    } 
    else
    {
        issues = issues.OrderBy(sort.Column, sort.Direction);
    }
}

这篇关于MvcContrib Grid对复杂对象进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆