Asp.net mvc MVCContrib网格在为空时显示标题?
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中): 你不能只注释掉检查,看看它是否应该呈现标题吗。我遗漏了什么,还是您
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<T>"/> 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();
}