2012-10-12 36 views
10

Lets sagen, dass ich machen eine Checkbox:MvcContrib Gitter und Kontrollkästchen

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

ASP wird sich das als:

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

Da ASP gibt zwei Eingänge mit dem gleichen Namen für eine Checkbox, bekommen wir auch zwei GET-Parameter in der URL, wenn das Formular mit der Checkbox Vorlage:

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

Können sagen, ich bin auch mit MvcContrib f oder Anzeige einer Tabelle mit Sortierung.

Wenn ich eine Spalte sortiere, kann MvcContrib die doppelten GET-Parameter nicht verstehen, und anstatt ?Checked=true&Checked=false zu schreiben, schreibt es ?Checked=true%2Cfalse, das von MVC3 nicht zu einem bool geparst werden kann. Die Fehlermeldung nach dem Sortieren lautet:

String was not recognized as a valid Boolean. 

Hat jemand anderes dieses Problem mit dem MvcContrib-Grid erfahren?

Antwort

4

Okay, denke ich, mit der Lösung gekommen sind:

Erstellen Sie Ihre eigenen 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); 
     } 
    } 
} 

... und ersetzen Sie einfach

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

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

Und verwenden Sie Ihr neues Rendering wie folgt:

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

0

Bad Lösung, aber funktioniert:

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

Bitte geben Sie die anderen serverseitige Lösung.

1

Ich hatte das gleiche Problem und nach der Suche und versuchen eine Menge verschiedener Lösungen, löste eine einfache Änderung es. Stellen Sie sicher, dass Sie dies in Ihrem Controller direkt vor "Rückkehr Ansicht" setzen:

ModelState.Remove("Checked"); 
Verwandte Themen