我正在编写一个自定义HTML帮助器来显示一个Grid,我正专注于Telerik和其他各方,我想使用的语法。
我有一个包含3个属性的模型(Name,DateUpdated和DateCreted),并且将IEnumerable传递给我的视图:
@model IEnumerable<GridPageFolderViewModel>
然后我有我的静态HtmlHelperExtensions类:
public static class HtmlHelperExtensions
{
#region Grid
public static GridBuilder<TModelEntry> GridFor<TModel, TModelEntry>(this HtmlHelper<TModel> htmlHelper, TModelEntry model)
{
return new GridBuilder<TModelEntry>();
}
#endregion
}
此类确实返回一个GridBuilder,如下所示:
public class GridBuilder<TModel> : IGridBuilder
{
#region Properties
private string name { get; set; }
#endregion
#region Methods
public GridBuilder<TModel> WithColumns(Action<ColumnBuilder<TModel>> function)
{
return this;
}
internal MvcHtmlString Render()
{
return new MvcHtmlString("This is a value.");
}
#endregion
#region IGridBuilder Members
public GridBuilder<TModel> Name(string name)
{
this.name = name;
return this;
}
#endregion
#region IHtmlString Members
public string ToHtmlString()
{ return Render().ToHtmlString(); }
#endregion
}
然后我有了我的ColumnBuilder类。
public class ColumnBuilder<TModel>
{
public void Bind<TItem>(Func<TModel, TItem> func)
{
}
}
将所有这些代码放到位(此时不呈现任何内容),我可以使用以下语法:
@(Html.GridFor(new GridPageFolderViewModel())
.Name("PageOverviewGrid")
.WithColumns(column =>
{
column.Bind(c => c.Name);
column.Bind(c => c.DateCreated);
column.Bind(c => c.DateUpdated);
}
)
这里的'问题'是我需要指定Grid中单个项目所持有的对象类型(GridPageFolderViewModel),否则,我无法访问列绑定器代码中的属性。
任何人都有一些关于如何摆脱它的建议吗?
答案 0 :(得分:1)
由于视图模型为IEnumerable<GridPageFolderViewModel>
,您只需要声明这样的帮助:
public static GridBuilder<TModelEntry> GridFor<TModelEntry>(this HtmlHelper<IEnumerable<TModelEntry>> htmlHelper)
{
return new GridBuilder<TModelEntry>();
}
这意味着您的帮助程序只能用于模型为IEnumerable<T>
的视图,但我认为这是有道理的。
现在,您可以执行以下操作:
@(Html.GridFor()
.Name("PageOverviewGrid")
.WithColumns(column =>
{
column.Bind(c => c.Name);
column.Bind(c => c.DateCreated);
column.Bind(c => c.DateUpdated);
}
)
PS。如果您需要访问帮助程序中的模型,请不要担心。您仍然可以从htmlHelper.ViewData.Model
检索它,它将被很好地输入为IEnumerable<TModelEntry>
希望它有所帮助!