MVC:自定义,流利的Html助手

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),否则,我无法访问列绑定器代码中的属性.

任何人都有一些关于如何摆脱它的建议?

Dan*_*.G. 1

由于视图模型是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>

希望能帮助到你!