Можно ли оптимизировать эти простые HtmlHelpers? - PullRequest
0 голосов
/ 21 января 2012

У меня есть эти вспомогательные методы:

@AdminHelper.BeginLeftMenu()

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

@AdminHelper.EndLeftMenu()

Можно ли сделать так, чтобы это выглядело так:

@AdminHelper.LeftMenu() {

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

}

Вместо этого, и как бы это выглядело в c #?

Ответы [ 2 ]

4 голосов
/ 21 января 2012

Как насчет того, чтобы это выглядело следующим образом:

@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);
    }
}
0 голосов
/ 21 января 2012

Два способа справиться с этим.

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")

YouМожно также создать папку App_Code и все extention.cshtml в этой папке и добавить вышеупомянутый помощник в файл.

Подробнее: http://www.asp.net/mvc/videos/mvc-3/mvc-3-razor-helpers

...