Question

Quelqu'un at-il rencontré une bonne solution pour l'utilisation ./Views/Shared/DisplayTemplates et ./Views/Shared/EditTemplates avec le MvcContrib.UI Grille?

Je suppose que je pourrais wireup un CustomItemRenderer, mais je préférerais être en mesure de faire quelque chose comme:

<% 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();
%>

Il peut déjà être quelque chose dans la grille pour le faire et je l'ai tout simplement pas encore trouvé. Toute aide serait grandement appréciée.

Merci,

Hal

Était-ce utile?

La solution

J'ai acheived en modifiant le code source dans les classes GridRenderer et GridColumn. Le changement de GridColumn est d'ajouter la fonction suivante:

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

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

Alors le changement de GridRenderer est dans la fonction RenderItem être modifiée comme suit:

 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);
}

Une fois que vous faites cela la grille utilisera les modèles trouvés. Je n'ai testé avec DisplayTemplates car cela est tout ce que je besoin, mais il devrait également fonctionner pour EditorTemplates avec un léger changement.

Autres conseils

Je l'ai créé cette méthode d'extension:

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>");
                             });
}

apparence d'utilisation comme suit:

column.DisplayFor(Html, sector => sector.Created);

En fait, vous pouvez faire ceci:

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

Le problème avec cette approche est que tout le modèle sera transmis à la partie et non pas simplement la propriété.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top