【问题标题】:MVCContrib Grid showing headers when empty?MVCContrib Grid在空时显示标题?
【发布时间】:2010-08-03 01:26:47
【问题描述】:

MVCContrib Grid 中优雅的Action Syntax 为我们提供了Empty() 方法。但是,MvcContrib.UI.Grid.GridRenderer<T>.RenderHeader() 的默认行为是在网格为空时隐藏表格列标题。有没有办法在不需要重大重构的数据不存在时显示标题?

现在我听说默认隐藏标题和硬编码,但这对我来说并不酷。

顺便说一句,这就是幕后发生的事情(MvcContrib.UI.Grid.GridRenderer<T>):

protected virtual bool RenderHeader()
{
    //No items - do not render a header.
    if(! ShouldRenderHeader()) return false;

    RenderHeadStart();

    foreach(var column in VisibleColumns())
    {
        //Allow for custom header overrides.
        if(column.CustomHeaderRenderer != null)
        {
            column.CustomHeaderRenderer(new RenderingContext(Writer, Context, _engines));
        }
        else
        {
            RenderHeaderCellStart(column);
            RenderHeaderText(column);
            RenderHeaderCellEnd();
        }
    }

    RenderHeadEnd();

    return true;
}

protected virtual bool ShouldRenderHeader()
{
    return !IsDataSourceEmpty();
}

protected bool IsDataSourceEmpty()
{
    return DataSource == null || !DataSource.Any();
}

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2 mvccontrib


    【解决方案1】:

    您可以覆盖HtmlTableGridRenderer 类的ShouldRenderHeader() 方法。

    public class AlwaysRenderHeaderRenderer<T>
        : HtmlTableGridRenderer<T> where T : class
    {
        protected override bool ShouldRenderHeader()
        {
            return true;
        }
    }
    
    <%= Html.Grid(Model).RenderUsing(new AlwaysRenderHeaderRenderer<TypeOfModel>()) %>
    

    这种方法的一个副作用是,当网格为空时,将呈现一个空的表格正文而不是一条消息。提供给Empty() 的任何文本都会被忽略。这对我来说不是问题,因为无论如何我都在使用 JavaScript 在客户端操作表格,但请注意。

    【讨论】:

      【解决方案2】:

      HtmlTableGridRenderer 继承时,您还可以覆盖 RenderEmpty 以消除 Brant 遇到的问题。

      protected override void RenderEmpty()
          {
              RenderHeadStart();
              foreach(var column in VisibleColumns())
              {
                  RenderHeaderCellStart(column);
                  RenderHeaderText(column);
                  RenderHeaderCellEnd(); 
              }
              RenderHeadEnd();
              RenderBodyStart();
              RenderText("<tr><td colspan=\"" + VisibleColumns().Count() + "\">" + GridModel.EmptyText + "</td></tr>");
              RenderBodyEnd();
          }
      

      【讨论】:

        【解决方案3】:

        在您的自定义网格渲染器(子类 GridRenderer&lt;T&gt;)中,使用如下覆盖:

        /// <summary>
        /// Renders the <c>table</c> header.
        /// </summary>
        /// <returns>
        /// Returns the negative of the results
        /// of <see cref="GridRenderer<T>.IsDataSourceEmpty"/>.
        /// </returns>
        /// <remarks>
        /// The return value of <see cref="GridRenderer<T>.IsDataSourceEmpty"/>
        /// in this override has no effect on whether the Grid header is rendered.
        /// 
        /// However, this return value is used
        /// by <see cref="GridRenderer<T>.Render"/>
        /// to run <see cref="GridRenderer<T>.RenderItems"/>
        /// or <see cref="GridRenderer<T>.RenderEmpty"/>.
        /// </remarks>
        protected override bool RenderHeader()
        {
            RenderHeadStart();
        
            foreach(var column in VisibleColumns())
            {
                //Allow for custom header overrides.
                if(column.CustomHeaderRenderer != null)
                {
                    column.CustomHeaderRenderer(new RenderingContext(Writer, Context, _engines));
                }
                else
                {
                    RenderHeaderCellStart(column);
                    RenderHeaderText(column);
                    RenderHeaderCellEnd();
                }
            }
        
            RenderHeadEnd();
        
            return !base.IsDataSourceEmpty();
        }
        

        protected override void RenderEmpty()
        {
            RenderBodyStart();
            WriteNoRecordsAvailable(base.Writer, this._numberOfTableColumns);
            RenderBodyEnd();
        }
        

        请注意,WriteNoRecordsAvailable() 是我的自定义方法,因此可以忽略。

        最后:

        /// <summary>
        /// This private member is duplicated
        /// in order to override <see cref="GridRenderer<T>.RenderHeader"/>.
        /// </summary>
        readonly ViewEngineCollection _engines;
        

        /// <summary>
        /// Initializes a new instance of the <see cref="CrmHtmlTableGridRenderer&lt;T&gt;"/> class.
        /// </summary>
        /// <param name="engines">The engines.</param>
        public CrmHtmlTableGridRenderer(ViewEngineCollection engines)
            : base(engines)
        {
            _engines = engines;
        }
        

        【讨论】:

          【解决方案4】:

          你不能只注释掉检查以查看它是否应该呈现标题。我是否遗漏了某些内容,或者您​​是否希望它始终显示标题?

          如果是,则注释掉该行。

          //if(! ShouldRenderHeader()) return false;
          

          我没有查看所有代码,但从您的代码 sn-p 看来应该可以工作。

          【讨论】:

          • 我不想禁用 MVCContrib 中的默认功能...我们需要寻找正式的扩展点...
          • 我现在明白了……我已经有一个“正式的可扩展点”在工作;它是子类GridRenderer&lt;T&gt;---我所要做的(似乎)就是覆盖RenderHeader()...
          【解决方案5】:

          David'sBrant's 的组合答案:

          protected override bool ShouldRenderHeader()
          {
              return true;
          }
          
          // Oddly Render relies on ShouldRenderHeader to return IsDataSourceEmpty
          // so RenderItems will always be called.
          protected override void RenderItems()
          {
              if (IsDataSourceEmpty())
                  RenderEmpty();
              else
                  base.RenderItems();
          }
          
          protected override void RenderEmpty()
          {
              RenderBodyStart();
              RenderText("<tr><td colspan=\"" + VisibleColumns().Count() + "\">" + GridModel.EmptyText + "</td></tr>");
              RenderBodyEnd();
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-09
            • 2011-04-25
            • 2014-10-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多