这些简单的HtmlHelper可以优化吗

本文关键字:优化 HtmlHelper 简单 | 更新日期: 2023-09-27 18:20:55

我有这些助手方法:

@AdminHelper.BeginLeftMenu()
    <a href="#">content</a>
@AdminHelper.EndLeftMenu()

有没有可能让它看起来更像:

@AdminHelper.LeftMenu() {
    <a href="#">content</a>
}

相反,它在c#中会是什么样子?

这些简单的HtmlHelper可以优化吗

让它看起来像这样怎么样:

@using (Html.BeginLeftMenu())
{
    <a href="#">content</a>
}

它将生成例如:

<li>
    <a href="#">content</a>
</li>

你本可以这样实现它:

public static class HtmlHelperExtensions
{
    private class Menu : IDisposable
    {
        private readonly TextWriter _writer;
        public Menu(TextWriter writer)
        {
            _writer = writer;
        }
        public void Dispose()
        {
            _writer.Write("</li>");
        }
    }
    public static IDisposable BeginLeftMenu(this HtmlHelper htmlHelper)
    {
        var writer = htmlHelper.ViewContext.Writer;
        writer.Write("<li>");
        return new Menu(writer);
    }
}

有两种方法可以处理此问题。

1) 您可以创建如下HtmlHelper的Extension方法。

 public static MvcHtmlString CreateListLink(this HtmlHelper helper, string href, string linkName)
    {
       return new MvcHtmlString(string.Format("<li><a href='"{0}'">{1}</a></li>", href, linkName));                    
    }

你可以在下面使用它

@Html.CreateListLink("javascript:alert('yada yada yada')", "Test Me")

它将生成类似的html文本

<li>
    <a href="javascript:alert('yada yada yada')">Test Me</a>
</li>

2) 你可以更喜欢Asp.net MVC的新功能,并使用@helper razor语法

@helper MyHelper(string href, string linkName){          
        <li><a href="@href">@linkName</a></li>;          
      }
 @MyHelper("javascript:alert('I am from razor..!!')", "hi")

您还可以在该文件夹下创建App_Code文件夹和所有扩展名.cshtml,并在文件中添加上面的帮助程序。

更多详细信息:http://www.asp.net/mvc/videos/mvc-3/mvc-3-razor-helpers