Начало и конец Div с использованием двух элементов управления - Asp.net MVC - PullRequest
3 голосов
/ 15 декабря 2009

В приложении Asp.net MVC я хотел бы инкапсулировать уродливый код-обертку (просто буквальную открывающую строку html и другую закрывающую строку), которую мы используем, чтобы сделать углы и тени совместимыми со старыми браузерами (мы не используем javascript по соображениям производительности) способом, совместимым с визуальным представлением дизайна студии.

Я бы хотел поместить div-обертки в элемент управления, чтобы я мог использовать их на странице просмотра .aspx, и мне не нужно было просматривать весь беспорядок, необходимый для создания причудливых углов и теней, но при этом получать преимущество от просмотра результаты в конструкторе.

// открываем обертку фактическое содержание // закрываем литерал оболочки

Я не мог понять, как внедрить содержимое в 1 элемент управления и получить результаты, видимые в дизайнере, как это делают главные страницы, поэтому я тестирую систему с использованием 2 элементов управления, содержащих буквенный html.

пример использования - с одним открытием элемента управления и другим закрытием

<ShadowBoxStart /> //contains div open tags
Hello World. This is actual content with all the nice style divs wrapped around
<ShadowBoxEnd /> //contains div close tags

Это корректно отображается во всех браузерах, когда я запускаю приложение, но дизайнер, кажется, смущен тем фактом, что один элемент управления открывает элементы div, а другой закрывает их и создает нежелательную информацию. Используемые мной System.Web.Mvc.ViewUserControls не содержат ничего, кроме буквального html, и я воспроизвел поведение с несколькими различными стандартными конфигурациями style & div, поэтому я озадачен тем, что сбивает с толку дизайнера.

Я бы хотел, чтобы решение было по-настоящему простым, потому что это, в основном, удобная установка, и она не стоит больших сложностей. Есть идеи?

1 Ответ

5 голосов
/ 15 декабря 2009

Задумывались ли вы о создании расширения HtmlHelper в виде расширения BeginForm, которое позволяло бы вам выполнять одиночные теги открытия / закрытия. Это расширение возвращает объект класса, который реализует IDisposable и использует метод Dispose для генерации закрывающего тега.

Тогда ваш HTML будет выглядеть так:

<% using (Html.ShadowBoxStart()) { %>
   Hello, World!
<% } %>

Код, который вы можете адаптировать:

public static class HtmlHelperExtensions
{
    /// <summary>
    /// Begins a container block using the specified tag.  Writes directly to the response.  Expected to be used within a using block.
    /// </summary>
    /// <param name="helper">HtmlHelper object from a View.</param>
    /// <param name="tag">The container tag (div, span, hN, etc.)</param>
    /// <returns>An MvcContainer that writes the closing tag when it is disposed.</returns>
    public static MvcContainer BeginContainer( this HtmlHelper helper, string tag )
    {
        return BeginContainer( helper, tag, null );
    }

    /// <summary>
    /// Begins a container block using the specified tag.  Writes directly to the response.  Expected to be used within a using block.
    /// </summary>
    /// <param name="helper">HtmlHelper object from a View.</param>
    /// <param name="tag">The container tag (div, span, hN, etc.)</param>
    /// <param name="htmlAttributes">HTML attribute to apply to the tag.</param>
     /// <returns>An MvcContainer that writes the closing tag when it is disposed.</returns>
    public static MvcContainer BeginContainer( this HtmlHelper helper, string tag, object htmlAttributes )
    {
        var builder = new TagBuilder( tag );
        builder.MergeAttributes( new ParameterDictionary( htmlAttributes ) );
        helper.ViewContext.HttpContext.Response.Write( builder.ToString( TagRenderMode.StartTag ) );
        return new MvcContainer( helper.ViewContext.HttpContext.Response, tag );
    }
}

Класс контейнера:

/// <summary>
/// Used by the HtmlHelpeExtensions in conjunction with a using block to close
/// a container tag.
/// </summary>
public class MvcContainer : IDisposable
{
    protected bool Disposed { get; set; }
    protected HttpResponseBase HttpResponse { get; set; }
    protected string Tag { get; set; }

    public MvcContainer( HttpResponseBase httpResponse, string tag )
    {
        if (httpResponse == null)
        {
            throw new ArgumentNullException( "httpResponse" );
        }

        if (string.IsNullOrEmpty( tag ))
        {
            throw new ArgumentNullException( "tag" );
        }

        this.HttpResponse = httpResponse;
        this.Tag = tag;
    }

    /// <summary>
    /// Write the closing tag
    /// </summary>
    public virtual void EndContainer()
    {
        this.Dispose( true );
    }

    #region IDisposable Members

    /// <summary>
    /// Write the closing tag
    /// </summary>
    public void Dispose()
    {
        this.Dispose( true );
        GC.SuppressFinalize( this );
    }

    protected virtual void Dispose( bool disposing )
    {
        if (!this.Disposed)
        {
            this.Disposed = true;
            this.HttpResponse.Write( string.Format( "</{0}>", this.Tag ) );
        }
    }

    #endregion
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...