Frage

hat über eine gute Lösung jemand kommt für ./Views/Shared/DisplayTemplates und ./Views/Shared/EditTemplates mit dem MvcContrib.UI Grid mit?

Ich glaube, ich einen CustomItemRenderer wireup könnte, aber ich würde viel lieber der Lage sein, so etwas wie:

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

Es kann schon etwas in Grid sein, dies zu tun, und ich habe festgestellt, es nur noch nicht. Jede Hilfe wäre sehr geschätzt.

Danke,

Hal

War es hilfreich?

Lösung

Ich habe diese acheived durch den Quellcode in den GridRenderer und Gridcolumn-Klassen zu modifizieren. Die Änderung in der Gridcolumn ist die folgende Funktion hinzuzufügen:

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

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

Dann wird die Änderung in GridRenderer ist in der RenderItem Funktion geändert werden, wie folgt:

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

Wenn Sie dies tun, das Gitter werden die Vorlagen gefunden. Ich habe nur mit DisplayTemplates getestet, wie dies alles brauche ich, aber es sollte auch Arbeit für EditorTemplates mit einer geringfügigen Änderung.

Andere Tipps

Ich habe diese Erweiterung Methode erstellt:

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

Verwendung sieht aus wie folgt:

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

Eigentlich könnten Sie dies tun:

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

Das Problem bei diesem Ansatz ist, dass das ganze Modell auf die teilweise weitergegeben werden und nicht nur die Eigenschaft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top