这些简单的HtmlHelper可以优化吗?

时间:2012-01-21 17:12:01

标签: c# asp.net-mvc razor html-helper

我有这些帮助方法:

@AdminHelper.BeginLeftMenu()

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

@AdminHelper.EndLeftMenu()

是否有可能让它看起来更像:

@AdminHelper.LeftMenu() {

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

}

相反,它会在c#中扮演什么样的角色?

2 个答案:

答案 0 :(得分:4)

如何让它看起来像这样:

@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 :(得分:0)

你可以通过两种方式解决这个问题。

1)您可以创建HtmlHelper的扩展方法,如下所示。

 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文件夹和所有extention.cshtml,并在文件中添加上面的帮助程序。

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