Pregunta

¿Alguien ha encontrado una buena solución para el uso de ./Views/Shared/DisplayTemplates y ./Views/Shared/EditTemplates con el MvcContrib.UI cuadrícula?

Creo que podría wireup un CustomItemRenderer, pero yo preferiría ser capaz de hacer algo como:

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

Ya puede ser algo en la red para hacer esto y yo simplemente no han encontrado todavía. Cualquier ayuda sería muy apreciada.

Gracias,

Hal

¿Fue útil?

Solución

He acheived esto modificando el código fuente de las clases GridRenderer y GridColumn. El cambio en GridColumn es agregar la siguiente función:

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

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

A continuación, el cambio en GridRenderer está en la función RenderItem que ser cambiado como sigue:

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

Una vez hecho esto la red utilizará las plantillas encontró. Sólo he probado con DisplayTemplates ya que esto es todo lo que necesito, pero debe también trabajo para EditorTemplates con un ligero cambio.

Otros consejos

He creado este método de extensión:

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

miradas de uso como el siguiente:

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

En realidad, usted puede hacer esto:

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

El problema con este enfoque es que todo el modelo se pasará a la parcial y no simplemente la propiedad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top