Общие функции MVC Razor в нескольких видах - PullRequest
31 голосов
/ 14 июня 2011

У меня есть функции, на мой взгляд, общие для нескольких страниц:

@functions 
{
    public HtmlString ModeImage(ModeEnum mode) 
    {
        switch(mode)
        {
            case AMode: new HtmlString("<img etc..."); break;
            // more etc...
        }
    }
}

Есть ли способ разместить его в отдельном файле и включить на каждую страницу, не копируя и не вставляя его в каждую страницу? Я знаю, что могу написать файл .cs и получить к нему доступ на каждой странице, но эта функция действительно касается представления, и мне не хотелось бы перекомпилировать ее, если эта функция изменится.

Ответы [ 3 ]

34 голосов
/ 12 ноября 2014

(Вот более подробная версия существующих ответов.)

Создайте папку с именем App_Code в корне проекта MVC, если она еще не существует. Здесь создайте пустой вид бритвы и назовите его как хотите:

MVC project with Razor view called Shared.cshtml inside App_Code folder

Добавьте @helper s и / или static методов к нему по мере необходимости:

@helper ShowSomething()
{
    <span>Something</span>
}

@functions
{
    public static int CalculateSomething()
    {
        return 1;
    }
}

Затем используйте их из своих представлений, сначала получив доступ к общему представлению по имени:

@Shared.ShowSomething()
@Shared.CalculateSomething()
20 голосов
/ 14 июня 2011

Похоже, вам нужны методы Razor @helper, описанные в сообщении в блоге ASP.NET MVC3 и синтаксис @helper в Razor Скотта Гатри.

Вот обзор ... "Синтаксис @helper в Razor позволяет легко создавать вспомогательные методы многократного использования, которые могут инкапсулировать функциональность вывода в ваших шаблонах представления. Они обеспечивают лучшее повторное использование кода, а также облегчают чтение кода."

4 голосов
/ 14 июня 2011

Вы можете создать статическую вспомогательную страницу и добавить на страницу обычный static метод.
Затем вы можете позвонить, написав PageName.MyMethod() где угодно, и я считаю, что вам не нужно будет перекомпилировать проект.

...