2011-04-16 10 views
5

que tienen la siguiente estructura:sortdir que no trabaja en el tipo de datos de enumeración en MVC 3 WebGird

Modelo

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

    public string Source { get; set; } 
} 

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

Ver

<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> 

controlador

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

Cuando haga clic en la columna "Fuente" que es de escriba string, el sordir cambiará de "ASC" a "DESC", pero cuando intente lo mismo en la columna "Tipo" sordir siempre devolverá "ASC".

Respuesta

4

la respuesta aceptada actual no es la respuesta a su problema.

Parece que las enumeraciones no están ordenadas cuando no menciona el nombre de columna en la operación de vinculación. Lo solucioné al proporcionar todos los nombres de columna necesarios al vincular mi modelo a la red web. La propiedad UserType es una enumeración en este ejemplo.

 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"),     
     ); 

Así que creo que la clasificación va a funcionar sin cambiar su controlador si se implementa a siguiente código:

<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

Intente configurar el Grid.SortColumn con la última columna ordenada.

código del controlador

ViewData["lastsortedcol"] = Request["sort"]; 

Ver código.

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 + "")) 
    ) 
)); 
1

He tenido esto suceder varias veces; específicamente cuando se vincula un tipo de enumeración a una columna.

He descubierto que se puede conseguir alrededor de este problema (aunque esto es una grave cludge) cambiando el valor ColumnName al nombre de una propiedad de tipo no utilizado, no la enumeración y luego colocarla en el valor correcto en su Controlador antes de usarlo:

Por ej. - esto falla:

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

a continuación, cambiar a algo así como:

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

En mi método controlador entonces que hago:

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