Не работает sortdir для типа данных enum в MVC 3 WebGird - PullRequest
5 голосов
/ 16 апреля 2011

У меня есть следующая структура:

Модель

public class EventEntry : LogEntry
{
    public EventType Type { get; set; }

    public string Source { get; set; }
}

public enum EventType : int
{
    Information = 1,
    Warning = 2,
    Error = 3
} 

View

<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) {...}

Когда я нажимаю на столбец «Источник», который имеет тип string, sordir изменится с «ASC» на «DESC», но когда я попробую то же самое в столбце «Type», sordir всегда вернет «ASC».

Ответы [ 3 ]

4 голосов
/ 15 июня 2012

Текущий принятый ответ не является решением вашей проблемы.

Кажется, что перечисления не сортируются, если вы не упомянули имя столбца в операции связывания. Я исправил это, указав все необходимые имена столбцов при привязке моей модели к веб-сетке. Свойство 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>
1 голос
/ 02 марта 2012

У меня было такое несколько раз; особенно при привязке типа перечисления к столбцу.

Я обнаружил, что вы можете обойти эту проблему (хотя это серьезный 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;
1 голос
/ 11 июня 2011

Попробуйте установить 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 + ""))
      )
));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...