【问题标题】:Create Extension Method to Produce Open & Closing Tags like Html.BeginForm()创建扩展方法以生成打开和关闭标签,如 Html.BeginForm()
【发布时间】:2010-03-12 21:05:05
【问题描述】:

我想知道是否有可能创建一个功能和行为类似于 Html.BeginForm() 的扩展方法,因为它会生成一个完整的 Html 标记,我可以在 <% { & } %> 标记中指定它的内容。

例如,我可以有这样的视图:

<% using(Html.BeginDiv("divId")) %>
<% { %>
    <!-- Form content goes here -->
<% } %>

此功能在我尝试通过this question 中的示例生成的功能的上下文中非常有用

这将使我能够为我将成为的类型创建容器

<% var myType = new MyType(123, 234); %>
<% var tag = new TagBuilder("div"); %>

<% using(Html.BeginDiv<MyType>(myType, tag) %>
<% { %>
    <!-- controls used for the configuration of MyType  -->
    <!-- represented in the context of a HTML element, e.g.:  -->

    <div class="MyType" prop1="123" prop2="234">
        <!-- add a select here -->
        <!-- add a radio control here -->
        <!-- whatever, it represents elements in the context of their type -->
    </div>

<% } %>

我意识到这会产生无效的 XHTML,但我认为可能还有其他好处超过这一点,特别是因为这个项目不需要 XHTML 验证 W3C 标准。

谢谢

戴夫

【问题讨论】:

    标签: c# asp.net-mvc xhtml extension-methods html.beginform


    【解决方案1】:

    不太确定这比简单地定义一个 &lt;div&gt; 元素有多少价值,但类似这样

    /// <summary>
    /// Represents a HTML div in an Mvc View
    /// </summary>
    public class MvcDiv : IDisposable
    {
        private bool _disposed;
        private readonly ViewContext _viewContext;
        private readonly TextWriter _writer;
    
        /// <summary>
        /// Initializes a new instance of the <see cref="MvcDiv"/> class.
        /// </summary>
        /// <param name="viewContext">The view context.</param>
        public MvcDiv(ViewContext viewContext) {
            if (viewContext == null) {
                throw new ArgumentNullException("viewContext");
            }
            _viewContext = viewContext;
            _writer = viewContext.Writer;
        }
    
        /// <summary>
        /// Performs application-defined tasks associated with 
        /// freeing, releasing, or resetting unmanaged resources.
        /// </summary>
        public void Dispose()
        {
            Dispose(true /* disposing */);
            GC.SuppressFinalize(this);
        }
    
        /// <summary>
        /// Releases unmanaged and - optionally - managed resources
        /// </summary>
        /// <param name="disposing"><c>true</c> to release both 
        /// managed and unmanaged resources; <c>false</c> 
        /// to release only unmanaged resources.</param>
        protected virtual void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                _disposed = true;
                _writer.Write("</div>");
            }
        }
    
        /// <summary>
        /// Ends the div.
        /// </summary>
        public void EndDiv()
        {
            Dispose(true);
        }
    }
    
    
    /// <summary>
    /// HtmlHelper Extension methods for building a div
    /// </summary>
    public static class DivExtensions
    {
        /// <summary>
        /// Begins the div.
        /// </summary>
        /// <param name="htmlHelper">The HTML helper.</param>
        /// <returns></returns>
        public static MvcDiv BeginDiv(this HtmlHelper htmlHelper)
        {
            // generates <div> ... </div>>
            return DivHelper(htmlHelper, null);
        }
    
        /// <summary>
        /// Begins the div.
        /// </summary>
        /// <param name="htmlHelper">The HTML helper.</param>
        /// <param name="htmlAttributes">The HTML attributes.</param>
        /// <returns></returns>
        public static MvcDiv BeginDiv(this HtmlHelper htmlHelper, IDictionary<string, object> htmlAttributes)
        {
            // generates <div> ... </div>>
            return DivHelper(htmlHelper, htmlAttributes);
        }
    
        /// <summary>
        /// Ends the div.
        /// </summary>
        /// <param name="htmlHelper">The HTML helper.</param>
        public static void EndDiv(this HtmlHelper htmlHelper)
        {
            htmlHelper.ViewContext.Writer.Write("</div>");
        }
    
        /// <summary>
        /// Helps build a html div element
        /// </summary>
        /// <param name="htmlHelper">The HTML helper.</param>
        /// <param name="htmlAttributes">The HTML attributes.</param>
        /// <returns></returns>
        private static MvcDiv DivHelper(this HtmlHelper htmlHelper, IDictionary<string, object> htmlAttributes)
        {
            TagBuilder tagBuilder = new TagBuilder("div");
            tagBuilder.MergeAttributes(htmlAttributes);
    
            htmlHelper.ViewContext.Writer.Write(tagBuilder.ToString(TagRenderMode.StartTag));
            MvcDiv div = new MvcDiv(htmlHelper.ViewContext);
    
            return div;
        }
    }
    

    并像这样使用

    <% using (Html.BeginDiv(new Dictionary<string, object>{{"class","stripey"}}))
    { %>
           <p>Content Here</p>
    <% } %>
    

    将渲染

    <div class="stripey">
        <p>Content Here</p>
    </div>
    

    或者没有html属性

    <% using (Html.BeginDiv())
    { %>
           <p>Content Here</p>
    <% } %>
    

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多