我通过修改 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,只需稍作改动。