sortdir不能在MVC 3 WebGird的枚举数据类型上工作



我有以下结构:

模型
public class EventEntry : LogEntry
{
    public EventType Type { get; set; }
    public string Source { get; set; }
}
public enum EventType : int
{
    Information = 1,
    Warning = 2,
    Error = 3
} 
视图

<div id="grid">
@{
    var grid = new WebGrid(canPage: true, rowsPerPage: Ctrl.PageSize, canSort: true, ajaxUpdateContainerId: "grid");
    grid.Bind(Model.Events, rowCount: Model.TotalRecords, autoSortAndPage: false);
    grid.Pager(WebGridPagerModes.All);
    @grid.GetHtml(htmlAttributes: new { id="grid" },
            columns: grid.Columns(
            grid.Column("Type"),
            grid.Column("Source"));    
}
</div>
控制器

public ActionResult Index(int? page, string sort, string sortdir) {...}

当我点击字符串类型的"源"列时,sordir将从"ASC"变为"DESC",但是当我在"类型"列上尝试同样的事情时,sordir将始终返回"ASC"。

当前被接受的答案不是你问题的答案。

如果在绑定操作中没有提到列名,则似乎没有对枚举进行排序。我通过在将模型绑定到webgrid时提供所有必需的列名来解决这个问题。UserType属性在本例中是一个枚举。

        var webgrid = new WebGrid(rowsPerPage: 25);
        webgrid.Bind(Model, new[] { "FirstName", "MiddleName", "SurName", "UserType" });
        var columns = webgrid.Columns(
            webgrid.Column("FirstName", "Voornaam"),
            webgrid.Column("MiddleName", "Tussenvoegsels"),
            webgrid.Column("SurName", "Achternaam"),
            webgrid.Column("UserType", "Type gebruiker"),                
        );

所以我认为排序将工作不改变你的控制器,如果你实现以下代码:

<div id="grid">
@{
    var grid = new WebGrid(canPage: true, rowsPerPage: Ctrl.PageSize, canSort: true, ajaxUpdateContainerId: "grid");
    grid.Bind(Model.Events, new[] { "Type", "Source" }, rowCount: Model.TotalRecords, autoSortAndPage: false);
    grid.Pager(WebGridPagerModes.All);
    @grid.GetHtml(htmlAttributes: new { id="grid" },
            columns: grid.Columns(
            grid.Column("Type"),
            grid.Column("Source"));    
}
</div>

尝试使用最后排序的列设置Grid.SortColumn

控制器代码
ViewData["lastsortedcol"] = Request["sort"];

视图代码。

var grid = new WebGrid();
grid.Bind(source: userItems.PagedSet, rowCount: userItemsForSale.TotalCount,autoSortAndPage:false);
grid.SortColumn = (string)ViewData["lastsortedcol"] ;
Response.Write(grid.GetHtml(          
  columns: grid.Columns
      (
            grid.Column(columnName: "ItemName", header: "ItemName", format: (item) => Html.Label(((UserItemForSale)item.Value).ItemDetails.Name)),
            grid.Column(columnName: "Quantity", header: "Quantity", format: (item) => Html.Label(((UserItemForSale)item.Value).Qty + ""))
      )
));

我遇到过很多次这样的情况;特别是在将枚举类型绑定到列时。

我发现你可以绕过这个问题(虽然这是一个严重的cludge)通过更改ColumnName值为未使用的,非枚举类型属性的名称,然后在使用它之前将其设置为控制器中的正确值:

grid.Column("PaymentMethod", "Loan Delivery Method", item => string.Format("{0}", EnumHelper.GetFirstValueFromMetaDataAttribute(item.PaymentMethod, Constants.GENERALMETADATATAG))),

然后改成:

grid.Column("WaitForDocsNoOfRetries", "Loan Delivery Method", item => string.Format("{0}", EnumHelper.GetFirstValueFromMetaDataAttribute(item.PaymentMethod, Constants.GENERALMETADATATAG))),

在我的控制器方法中,我然后做:

sort = sort == "WaitForDocsNoOfRetries" ? "PaymentMethod": sort;

相关内容

  • 没有找到相关文章

最新更新