10

チェックボックスをレンダリングするとしましょう:

@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 はチェックボックスに対して同じ名前の 2 つの入力を出力するため、チェックボックスを使用してフォームを送信すると、URL に 2 つの GET パラメータも取得されます。

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

並べ替えを使用してテーブルを表示するために MvcContrib も使用しているとしましょう。

列をソートすると、MvcContrib は重複した GET パラメータを理解できず、 を書き込む代わりに、?Checked=true&Checked=falseMVC3?Checked=true%2Cfalseで bool に解析できない を書き込みます。並べ替え後のエラー メッセージは次のとおりです。

String was not recognized as a valid Boolean.

MvcContrib グリッドでこの問題を経験した人はいますか?

4

3 に答える 3

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(new CustomTableGridRenderer())

于 2012-10-17T12:09:06.380 に答える