2

MvcContrib.UIグリッドで./Views/Shared/DisplayTemplatesおよび./Views/Shared/EditTemplatesを使用するための優れたソリューションに出くわした人はいますか?

CustomItemRendererを接続できると思いますが、次のようなことができるようになります。

<% Html.Grid<Person>(Model.People)
         .Sort(new GridSortOptions {Column = Model.Column, Direction = Model.Direction})
         .Columns(column =>
         {
           column.For(e=>e.Name);
           column.DisplayFor(e=>e.StartDate); // <-- I'd like to do this for DateTime.asxc
         }).Render();
%>

グリッドにはこれを行うための何かがすでにあるかもしれませんが、私はまだそれを見つけていません。どんな助けでも大歓迎です。

ありがとう、

ハル

4

3 に答える 3

3

これは、GridRendererクラスとGridColumnクラスのソースコードを変更することで実現しました。GridColumnの変更は、次の関数を追加することです。

public object GetRawValue(T instance)
{
  if (!_cellCondition(instance))
  {
    return null;
  }

  var value = _columnValueFunc(instance);
  return value;
}

次に、GridRendererの変更は、次のように変更されるRenderItem関数にあります。

 protected virtual void RenderItem(GridRowViewData<T> rowData)
{
  BaseRenderRowStart(rowData);

  HtmlHelper<T> html = new HtmlHelper<T>(Context, new ViewPage());
  foreach (var column in VisibleColumns())
  {
    //A custom item section has been specified - render it and continue to the next iteration.
    if (column.CustomItemRenderer != null)
    {
      column.CustomItemRenderer(new RenderingContext(Writer, Context, _engines), rowData.Item);
      continue;
    }

    RenderStartCell(column, rowData);

    var cellValue = column.GetRawValue(rowData.Item);
    if (cellValue != null)
    {
      //RenderText(cellValue.ToString());         
      MvcHtmlString value = html.DisplayFor<T, object>(m => cellValue);
      string str = (value.ToString() == string.Empty) ? cellValue.ToString() : value.ToString();
      if (column.HtmlEncode == true)
      {
        str = (value.ToString() == string.Empty) ? HttpUtility.HtmlEncode(cellValue.ToString()) : value.ToHtmlString();
      }
      RenderText(str);
    }

    RenderEndCell();
  }

  BaseRenderRowEnd(rowData);
}

これを行うと、グリッドは見つかったテンプレートを使用します。必要なのはこれだけなので、DisplayTemplatesでテストしただけですが、わずかな変更を加えるだけでEditorTemplatesでも機能するはずです。

于 2010-09-01T23:49:06.353 に答える
2

私はこの拡張メソッドを作成しました:

public static IGridColumn<Column> DisplayFor<Column, Model, Value>(this ColumnBuilder<Column> column, HtmlHelper<Model> html, Func<Column, Value> getValueFunc)
    where Column : class
{
    return column.Custom(o =>
                             {
                                 var value = getValueFunc(o);
                                 return MvcHtmlString.Create("<span>" + html.DisplayFor(modelItem => value) + "</span>");
                             });
}

使用法は次のようになります。

column.DisplayFor(Html, sector => sector.Created);
于 2012-07-31T20:35:50.443 に答える
1

実際にこれを行うことができます:

column
    .For(model => model.StartDate)
    .Partial("~/Views/Shared/DisplayTemplates/YourModelName.ascx");

このアプローチの問題は、モデル全体がプロパティだけでなく部分的に渡されることです。

于 2010-05-21T11:42:08.897 に答える