Com*_*ity 5 c# asp.net-mvc html-helper
我正在编写一个自定义的HTML帮助器来显示一个Grid,我正专注于Telerik和其他各方,我想使用的语法.
我有一个具有3个属性(Name,DateUpdated和DateCreted)的模型,并将一个IEnumerable传递给我的视图:
@model IEnumerable<GridPageFolderViewModel>
Run Code Online (Sandbox Code Playgroud)
然后我有我的静态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
}
Run Code Online (Sandbox Code Playgroud)
这个类确实返回一个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
}
Run Code Online (Sandbox Code Playgroud)
然后我有我的ColumnBuilder类.
public class ColumnBuilder<TModel>
{
public void Bind<TItem>(Func<TModel, TItem> func)
{
}
}
Run Code Online (Sandbox Code Playgroud)
有了所有这些代码(此时没有呈现),我可以使用以下语法:
@(Html.GridFor(new GridPageFolderViewModel())
.Name("PageOverviewGrid")
.WithColumns(column =>
{
column.Bind(c => c.Name);
column.Bind(c => c.DateCreated);
column.Bind(c => c.DateUpdated);
}
)
Run Code Online (Sandbox Code Playgroud)
这里的"问题"是我需要指定Grid中单个项目所持有的对象类型(GridPageFolderViewModel),否则,我无法访问列绑定器代码中的属性.
任何人都有一些关于如何摆脱它的建议?
由于视图模型是IEnumerable<GridPageFolderViewModel>,你只需要像这样声明你的助手:
public static GridBuilder<TModelEntry> GridFor<TModelEntry>(this HtmlHelper<IEnumerable<TModelEntry>> htmlHelper)
{
return new GridBuilder<TModelEntry>();
}
Run Code Online (Sandbox Code Playgroud)
这意味着您的助手只能用于模型为 的视图IEnumerable<T>,但我认为这是有道理的。
现在在您看来您可以这样做:
@(Html.GridFor()
.Name("PageOverviewGrid")
.WithColumns(column =>
{
column.Bind(c => c.Name);
column.Bind(c => c.DateCreated);
column.Bind(c => c.DateUpdated);
}
)
Run Code Online (Sandbox Code Playgroud)
附言。如果您需要访问助手内的模型,请不要担心。您仍然可以从 检索它htmlHelper.ViewData.Model,这将很好地键入为IEnumerable<TModelEntry>
希望能帮助到你!