2010-05-20 116 views
2

有沒有人遇到過使用帶有MvcContrib.UI網格的./Views/Shared/DisplayTemplates和./Views/Shared/EditTemplates的好解決方案?MvcContrib網格和顯示/編輯模板

我想我可以wireup一個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(); 
%> 

有可能已經在電網東西做到這一點,我只是還沒有找到它。任何幫助將不勝感激。

感謝,

哈爾

回答

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,並稍作更改。

1

其實你可以這樣做:

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

這種方法的問題是,整個模型將被傳遞到局部,而不是簡單的財產。

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