Asp.net mvc MVCContrib网格在为空时显示标题?

Asp.net mvc MVCContrib网格在为空时显示标题?,asp.net-mvc,asp.net-mvc-2,mvccontrib,Asp.net Mvc,Asp.net Mvc 2,Mvccontrib,MVCContrib网格中的优雅为我们提供了Empty()方法。但是,MvcContrib.UI.Grid.GridRenderer.RenderHeader()的默认行为是在网格为空时隐藏表列标题。当数据不存在且不需要进行重大重构时,是否有一种方法可以显示标题 现在我听说了默认情况下隐藏标题和硬编码,但这对我来说并不酷 顺便说一句,这就是引擎罩下发生的事情(在MvcContrib.UI.Grid.GridRenderer中): 你不能只注释掉检查,看看它是否应该呈现标题吗。我遗漏了什么,还是您

MVCContrib网格中的优雅为我们提供了
Empty()
方法。但是,
MvcContrib.UI.Grid.GridRenderer.RenderHeader()的默认行为是在网格为空时隐藏表列标题。当数据不存在且不需要进行重大重构时,是否有一种方法可以显示标题

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

顺便说一句,这就是引擎罩下发生的事情(在
MvcContrib.UI.Grid.GridRenderer
中):


你不能只注释掉检查,看看它是否应该呈现标题吗。我遗漏了什么,还是您希望它始终显示标题

如果是这样的话,就把那一行注释掉

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

我还没有看过所有的代码,但从您的代码片段来看,它似乎应该可以工作。

在自定义网格渲染器(子类
GridRenderer
)中,使用如下覆盖:

/// <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();
}
请注意,
writeneRecordsAvailable()
是我的自定义方法,因此可以忽略它

最后:

/// <summary>
/// This private member is duplicated
/// in order to override <see cref="GridRenderer<T>.RenderHeader"/>.
/// </summary>
readonly ViewEngineCollection _engines;
//
///此私人成员是重复的
///为了超越。
/// 
只读视图引擎集合引擎;

//
///初始化类的新实例。
/// 
///引擎。
公共CrmHtmlTableGridRenderer(ViewEngineCollection引擎)
:底座(发动机)
{
_发动机=发动机;
}

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

public class AlwaysRenderHeaderRenderer<T>
    : HtmlTableGridRenderer<T> where T : class
{
    protected override bool ShouldRenderHeader()
    {
        return true;
    }
}

<%= Html.Grid(Model).RenderUsing(new AlwaysRenderHeaderRenderer<TypeOfModel>()) %>
public类始终是UnderheaderRenderer
:HtmlTableGridRenderer,其中T:class
{
受保护的重写bool ShouldRenderHeader()
{
返回true;
}
}

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

HtmlTableGridRenderer
继承时,您还可以覆盖
RenderMempty
以消除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();
    }
protectedoverride void RenderEmpty()受保护的覆盖
{
RenderHeadStart();
foreach(VisibleColumns()中的var列)
{
RenderHeaderCellStart(列);
RenderHeaderText(列);
RenderHeaderCellEnd();
}
RenderHeadEnd();
renderbort();
RenderText(“+GridModel.EmptyText+”);
RenderBodyEnd();
}
和答案的组合:

protectedoverride bool ShouldRenderHeader()
{
返回true;
}
//奇怪的是,Render依赖于ShouldRenderHeader返回IsDataSourceEmpty
//所以RenderItems将始终被调用。
受保护的覆盖无效RenderItems()
{
if(IsDataSourceEmpty())
RenderEmpty();
其他的
base.RenderItems();
}
受保护的覆盖无效RenderEmpty()
{
renderbort();
RenderText(“+GridModel.EmptyText+”);
RenderBodyEnd();
}

我不想禁用MVCContrib中的默认功能。。。我们需要寻找正式的扩展点…我现在明白了。。。我已经有了一个“正式扩展点”工作;它是子类
GridRenderer
——我要做的(似乎)就是重写
RenderHeader()
。。。
/// <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;
}
public class AlwaysRenderHeaderRenderer<T>
    : HtmlTableGridRenderer<T> where T : class
{
    protected override bool ShouldRenderHeader()
    {
        return true;
    }
}

<%= Html.Grid(Model).RenderUsing(new AlwaysRenderHeaderRenderer<TypeOfModel>()) %>
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();
    }
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();
}