2012-10-12 153 views
10

digamos que me hacen una casilla de verificación:rejilla MvcContrib y casillas de verificación

@Html.CheckboxFor(x => x.Checked) // Checked is true by default 

ASP a su vez, que a medida:

<input checked="checked" data-val="true" data-val-required="The field is required." id="Checked" name="Checked" type="checkbox" value="true" /> 
<input name="Checked" type="hidden" value="false" /> 

Desde ASP emite dos entradas con el mismo nombre para una casilla de verificación, también obtenemos dos parámetros GET en la URL al presentar el formulario con la casilla de verificación:

http://...?Checked=true&Checked=false 

digamos que también estoy usando MvcContrib f o mostrando una tabla con clasificación.

Cuando ordeno una columna, MvcContrib no puede entender los parámetros GET duplicados, y en lugar de escribir ?Checked=true&Checked=false, escribe ?Checked=true%2Cfalse, que MVC3 no puede analizar a bool. El mensaje de error después de la clasificación es:

String was not recognized as a valid Boolean. 

¿Alguien más ha experimentado este problema con la cuadrícula MvcContrib?

Respuesta

4

Está bien, creo que he llegado con la solución:

Crear su propio HtmlTableGridRenderer:

public class CustomTableGridRenderer<TViewModel> : HtmlTableGridRenderer<TViewModel> where TViewModel : class 
{ 
    protected override void RenderHeaderText(GridColumn<TViewModel> column) 
    { 
     if (IsSortingEnabled && column.Sortable) 
     { 
      string sortColumnName = GenerateSortColumnName(column); 

      bool isSortedByThisColumn = GridModel.SortOptions.Column == sortColumnName; 

      var sortOptions = new GridSortOptions 
      { 
       Column = sortColumnName 
      }; 

      if (isSortedByThisColumn) 
      { 
       sortOptions.Direction = (GridModel.SortOptions.Direction == SortDirection.Ascending) 
        ? SortDirection.Descending 
        : SortDirection.Ascending; 
      } 
      else //default sort order 
      { 
       sortOptions.Direction = column.InitialDirection ?? GridModel.SortOptions.Direction; 
      } 

      var routeValues = CreateRouteValuesForSortOptions(sortOptions, GridModel.SortPrefix); 

      //Re-add existing querystring 
      foreach (var key in Context.RequestContext.HttpContext.Request.QueryString.AllKeys.Where(key => key != null)) 
      { 
       if (!routeValues.ContainsKey(key)) 
       { 
        routeValues[key] = Context.RequestContext.HttpContext.Request.QueryString[key]; 
       } 
      } 

      var link = HtmlHelper.GenerateLink(Context.RequestContext, RouteTable.Routes, column.DisplayName, null, null, null, routeValues, null); 
      RenderText(link); 
     } 
     else 
     { 
      base.RenderHeaderText(column); 
     } 
    } 
} 

... y basta con sustituir

   if(! routeValues.ContainsKey(key)) 
       { 
        routeValues[key] = Context.RequestContext.HttpContext.Request.QueryString[key]; 
       } 

... con routeValues[key] = Context.RequestContext.HttpContext.Request.QueryString[key];

Y use su nueva representación de la siguiente manera:

@ Html.Grid() ... RenderUsing (nueva CustomTableGridRenderer())

0

mala solución, pero funciona:

$(function() { 
     $("a[href*='true%2Cfalse']").each(function() { 
      $(this).attr("href", $(this).attr("href").replace("true%2Cfalse", "true")); 
     }); 
    }); 

favor proporcionar a la otra solución de servidor.

1

Tuve el mismo problema y después de buscar y probar muchas soluciones diferentes, un simple cambio lo resolvió. Solo asegúrese de poner esto en su controlador justo antes de la "vista de retorno":

ModelState.Remove("Checked"); 
Cuestiones relacionadas