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

时间:2014-05-30 12:17:13

标签: c# asp.net-mvc html-helper

我正在编写一个自定义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),否则,我无法访问列绑定器代码中的属性。

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

1 个答案:

答案 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>

希望它有所帮助!