2012-10-12 40 views
10

可以說,我呈現一個複選框:MvcContrib電網和複選框

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

ASP將會把這一爲:

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

由於ASP輸出具有一個複選框兩個名稱相同的投入,我們也得到當提交複選框時,URL中有兩個GET參數:

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

假設我也使用MvcContrib f或者通過排序顯示錶格。

當我對列進行排序時,MvcContrib無法理解重複的GET參數,而不是編寫?Checked=true&Checked=false,而是編寫了?Checked=true%2Cfalse,它無法通過MVC3解析爲布爾值。排序後的錯誤消息是:

String was not recognized as a valid Boolean. 

有沒有其他人經歷過這個問題與MvcContrib網格?

回答

4

好了,想我已經拿出瞭解決方案:

創建自己的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); 
     } 
    } 
} 

...並只需更換

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

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

並使用您的新渲染像這樣:

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

0

壞的解決方案,但工程:

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

請提供其他的服務器端解決方案。

1

我有同樣的問題,經過搜索和嘗試了很多不同的解決方案,一個簡單的更改解決了它。只需確保在「返回視圖」之前將其置於您的控制器中:

ModelState.Remove("Checked");