我写了一个网格助手(GridHelper.cs),它适用于所有模型。
这个助手有一个渲染每一行的方法如下:
private void RenderRow(HtmlTextWriter writer, T item)
{
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
foreach (var col in _columns)
{
writer.RenderBeginTag(HtmlTextWriterTag.Td);
var value = typeof(T).GetProperty(col.FieldName).GetValue(item, null) ?? String.Empty;
writer.Write(value.ToString());
writer.RenderEndTag();
}
writer.RenderEndTag();
}
此外,我在文件夹中有一些DisplayTemplates:/ Views / Shared / DisplayTemplates 如布尔,日期等
如何将行writer.Write(value.ToString());
更改为使用该模板?
或者这条线需要做哪些更改才能在网格单元格中使用显示模板?
答案 0 :(得分:0)
将此示例用于该问题
public class TestCol<T>
{
public MvcHtmlString RenderObj<T, TValue>(HtmlHelper<T> html, Expression<Func<T, TValue>> expression)
{
return html.DisplayFor(expression);
}
}
public static class testHelper
{
//Expression<Func<TModel, TValue>> expression
public static MvcHtmlString TestStringHelper<TModel, TValue>(this HtmlHelper<TModel> html, TValue item)
{
var y = new TestCol<TModel>();
var x = y.RenderObj(html, modelitem => item);
return x;
}
public static MvcHtmlString TestModelHelper<T>(this HtmlHelper<T> html, T item)
{
var list = typeof(T).GetProperties().Where(p => p.PropertyType.Namespace == "System");
string str = "<table border=1><tr>";
foreach (var p in list)
{
var o = p.GetValue(item, null);
var xr = html.TestStringHelper(o).ToString();
if (string.IsNullOrWhiteSpace(xr)) xr = o.ToString();
str += string.Format("<td>{0}</td>", xr);
}
str += "</tr></table>";
return new MvcHtmlString(str);
}
}