代码之家  ›  专栏  ›  技术社区  ›  rasx

mvc中心网格显示空标题?

  •  2
  • rasx  · 技术社区  · 14 年前

    雅致 Action Syntax 在mvcontrib网格中, 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();
    }
    
    5 回复  |  直到 10 年前
        1
  •  5
  •   Brant Bobby    13 年前

    您可以覆盖 ShouldRenderHeader() 方法 HtmlTableGridRenderer 班级。

    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
  •  4
  •   David Wick    11 年前

    从继承时 HtmlTableGridRenderer 您还可以覆盖 RenderEmpty 为了解决布兰特遇到的问题。

    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
  •  3
  •   rasx    14 年前

    在自定义网格渲染器(子类 GridRenderer<T> )使用如下重写:

    /// <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
  •  0
  •   Jeff Treuting Charlie Martin    14 年前

    你就不能对检查进行注释,看看它是否应该呈现标题。我是丢失了什么,还是希望它始终显示标题?

    如果是这样,那就把这行注释掉。

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

    我没有看过所有的代码,但从您的代码片段来看,这似乎是可行的。

        5
  •  0
  •   Community basarat    7 年前

    结合 David's Brant'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();
    }