Где я должен размещать декларативные HTML-помощники в ASP.NET MVC 3

Я пытаюсь сделать декларативный HTML-помощник, как указано в сообщение ScottGu Razor, но мне не очень повезло. Я попытался поместить файл Helpers.cshtml с помощью DateTimeHelper в Views/Helpers, но он не подберет его, поэтому я попробовал в App_Code по бета-версию MVC 3 размещать. Теперь он подбирает его, но когда я пытаюсь использовать его в файле, например:

@DateTimeHelper (DateTime.Now)

Компилятор жалуется, что DateTimeHelper не существует.

Некоторые странные вещи: Если я переименую файл в DateTime.cshtml, я получаю другую ошибку, что-то о конкретном коде в моем помощнике.

Для полноты, здесь хелперный код:

@helper DateTimeHelper(DateTime t, bool longDate = true, bool showTime = true, bool longTime = true) {
    <time datetime='@t.ToUniversalTime()'>
        @if(longDate) {
            if(showTime) {
                if(longTime) {
                    @t.ToLongDateString() @t.ToLongTimeString();
                } else {
                    @t.ToLongDateString() @t.ToShortTimeString();
                }
            } else {
                @t.ToLongDateString()
            }
        } else {
            if(showTime) {
                if(longTime) {
                    @t.ToShortDateString() @t.ToLongTimeString();
                } else {
                    @t.ToShortDateString() @t.ToShortTimeString();
                }
            } else {
                @t.ToShortDateString()
            }
        }
    </time>
}

Помощник используется в определенном виде следующим образом:

@model dynamic

<div>
    <p> The current time is @DateTimeHelper(DateTime.Now)</p>
</div>

Ответ 1

Чтобы использовать функцию "@helper" в Razor, вам нужно поместить файл CSHTML в папку App_Code вашего приложения. В ASP.NET MVC нет папки "Views/Helpers". В блоге ScottGu было написано до того, как функция была полностью реализована, и некоторые из примечаний там не совсем точны.

Чтобы вызвать "@helper", который вы написали, вы должны указать как имя файла, так и имя помощника внутри него. Например, если у вас есть этот помощник:

~/App_Code/MyHelper.cshtml

И этот контент:

@helper ShowStuff(string stuff) {
    <p>@stuff</p>
}

Затем вы вызываете его так:

@MyHelper.ShowStuff("some stuff!")