MVCContrib Grid показывает пустые заголовки? - PullRequest
2 голосов
/ 03 августа 2010

Элегантный Синтаксис действия в сетке MVCContrib дает нам метод 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 ]

5 голосов
/ 11 апреля 2011

Вы можете переопределить метод 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, но будьте осторожны.

4 голосов
/ 07 июня 2011

При наследовании от 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 голосов
/ 04 августа 2010

В вашем пользовательском Grid Renderer (подкласс 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;
}
0 голосов
/ 06 июня 2014

Сочетание Дэвида и Бранта ответов:

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();
}
0 голосов
/ 03 августа 2010

Не могли бы вы просто закомментировать проверку, чтобы увидеть, должен ли он отображать заголовок.Я что-то упустил или вы хотите, чтобы он всегда отображал заголовок?

Если это так, закомментируйте эту строку.

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

Я не смотрю весь код, но из вашего фрагмента кода кажется, что он должен работать.

...