我正在 MVC 中创建一个流畅的 HtmlHelper - 创建一个基于 HTML 的网格。 我知道 mvc contrib 和 WebGrid - 但我正在制作自己的并且有一个特定的问题:
我必须输入这个:
@Html.DSGridFor().AddColumn(x=>x.FirstOrDefault().Message)
但我希望能够输入以下内容:
@Html.DSGridFor().AddColumn(x=>x.Message)
当我从 @Html.DSGridFor() 开始时调用的代码 - 采用基于页面的模型。
public static DSGridHelper<TModel> DSGridFor<TModel>(this HtmlHelper<TModel> html)
{
return new DSGridHelper<TModel>(html);
}
然后在 DSGridHelper 类中我有这个:
public DSGridHelper<TModel> AddColumn(Expression<Func<TModel, dynamic>> property, string HeaderText = null)
{
string ColumnName = (property.Body as MemberExpression).Member.Name;
DSGridColumn DSGC = new DSGridColumn();
DSGC.ColumnName = ColumnName;
DSGC.HeaderText = HeaderText ?? ColumnName;
DSColumnList.Add(DSGC);
return this;
}
public List<DSGridColumn> DSColumnList { get; set; }
目前的列类非常基本:
public class DSGridColumn
{
public DSGridColumn()
{
}
public string ColumnName { get; set; }
public string HeaderText { get; set; }
}
我可以让这段代码与基于字符串的列名称一起正常工作,但我希望 Razor 页面中的声明代码格式简单且类型强。目前我必须输入 x=>x.First().Message 但我实际上只需要 x=>x.Message 来标识该列。
我很感激任何帮助。
更新
感谢 Justin,我现在可以提供我/我们的代码。
查看:
@(Html.DSGridFor3().AddColumn(x => x.Message)
.AddColumn(x => x.Host)
.ToMvcString())
HTML 助手调用:
public static DSGridHelper3<T> DSGridFor3<T>(this HtmlHelper<IEnumerable<T>> htmlHelper)
{
return new DSGridHelper3<T>(htmlHelper);
}
返校:
public class DSGridHelper3<T>
{
private HtmlHelper _htmlHelper;
//private IEnumerable<T> _dataList;
public List<DSGridColumn> DSColumnList { get; set; }
public DSGridHelper3(HtmlHelper<IEnumerable<T>> htmlHelper)
{
_htmlHelper = htmlHelper;
// _dataList = htmlHelper.ViewData.Model;
DSColumnList = new List<DSGridColumn>();
}
public DSGridHelper3<T> AddColumn(Expression<Func<T, object>> property)
{
string columnName = (property.Body as MemberExpression).Member.Name;
DSGridColumn DSGC = new DSGridColumn();
DSGC.ColumnName = columnName;
DSGC.HeaderText = columnName;
DSColumnList.Add(DSGC);
return this;
}
public MvcHtmlString ToMvcString()
{
sb.Append("<table>");
sb.Append("<tr>");
sb.Append("<td>");
sb.Append("hello world within a table");
sb.Append(@"</td>");
sb.Append("<td>");
sb.Append("hello world within a table");
sb.Append(@"</td>");
sb.Append(@"</tr>");
sb.Append(@"</table>");
return new MvcHtmlString(sb.ToString());
}
}
更新2
如果您想手动插入不同的类型(可能是因为您将从 ViewData 而不是页面模型获取少量表数据),那么这里还有一些代码:
查看:
@(Html.DSGridFor3<DanSoftware.MVC.Areas.Errors.Code.ELMAH_Error>().AddColumn(x => x.Message).ToMvcString();)
DSGridHelper ...helper 的替代签名
public static DSGridHelper3<T> DSGridFor3<T>(this HtmlHelper htmlHelper)
{
return new DSGridHelper3<T>(htmlHelper);
}
附加构造函数:
public DSGridHelper3(HtmlHelper htmlHelper)
{
_htmlHelper = htmlHelper;
// _dataList = htmlHelper.ViewData.Model;
DSColumnList = new List<DSGridColumn>();
}
希望这对某人有帮助并感谢贾斯汀!
最佳答案
我没有 Visual Studio,但我会尝试一下...
我会在 DsGridFor
方法或 AddColumn
方法中将集合作为数据类型。这将允许您从集合发送强类型参数。假设您想要一个给定集合的 AddColumn
通用方法,可以访问类属性与集合方法,它看起来像这样(只是一个示例):
public static DSGridHelper<T> AddColumn<T>(this HtmlHelper<IEnumerable<T>> htmlHelper, Expression<Func<T, object>> property) where T : class
{
string columnName = (property.Body as MemberExpression).Member.Name;
DSGridColumn DSGC = new DSGridColumn();
DSGC.ColumnName = ColumnName;
DSGC.HeaderText = HeaderText ?? ColumnName;
DSColumnList.Add(DSGC);
return this;
}
根据您的情况,要新建一个 DsGridHelper
类,我可能首先显式设置模型类型,然后添加重载:
public static DSGridHelper<T> DSGridFor<T>(this HtmlHelper<IEnumerable<T>> htmlHelper) where T : class
{
return new DSGridHelper<T>(htmlHelper);
}
然后我的 DsGridHelper 可能看起来像这样:
public class DsGridHelper<T>
{
private HtmlHelper _htmlHelper;
private IEnumerable<T> _dataList;
public DsGridHelper(HtmlHelper<IEnumerable<T>> htmlHelper)
{
_htmlHelper = htmlHelper;
_dataList = htmlHelper.ViewData.Model;
}
public DsGridHelper<T> AddColumn(Expression<Func<T, object>> property)
{
string columnName = (property.Body as MemberExpression).Member.Name;
DSGridColumn DSGC = new DSGridColumn();
DSGC.ColumnName = ColumnName;
DSGC.HeaderText = HeaderText ?? ColumnName;
DSColumnList.Add(DSGC);
return this;
}
}
关于asp.net-mvc-3 - 基于 MVC3 razor 的 htmlhelper,具有基于模型的 lambda 字段表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6244017/