Открытые переменные в MVC 3 Razor _ViewStart - PullRequest
6 голосов
/ 27 ноября 2010

Я создаю сайт на новом движке Razor, который поставляется с MVC 3 (и мне нравится новый синтаксис!).Тем не менее, я в недоумении от использования открытых свойств / констант с ним.Я знаю, что с помощью WebForms мы могли бы добавить открытое свойство в коде:

public string ImageFolder { get; set; }

Я хотел бы определить важные переменные в одном глобальном месте, к которому могут обращаться мои представления, начиная с путей к файлам CSS и изображениям:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    var ContentFolder = "~/Content";
    var CssFolder = ContentFolder + "/Stylesheets";
    var ImageFolder = ContentFolder + "/Images";
}

Я попытался поместить вышеуказанный блок кода в _Layout, а также внутрь _ViewStart.Однако доступ к ним из дочерних представлений с треском проваливается.Я думал об определении открытого свойства в приведенном выше блоке кода, но оно не компилируется.

Решения?

  • Насколько я видел, никто не использует код с Razor.
  • Полагаю, я должен иметь возможность наследовать от представления по умолчанию и определять свои свойства там (как описано в Stack ).

Но я сильнонадеясь, что должен быть более простой способ сделать что-то такое простое?

Ответы [ 6 ]

5 голосов
/ 28 июля 2011

Вы можете создать папку «App_Code» и создать файл «GlobalVal.cshtml». ниже приведен пример кода в файле:

@functions{
    public static readonly string __siteHome = "http://www.example.com";
    public static readonly string __siteResource = "http://resource.example.com";
}

и ниже приведен образец с его использованием:

<a href="@GlobalVal.__siteHome/home/index">@GlobalVal.__siteHome</a>
4 голосов
/ 29 ноября 2010

Я решил пойти по еще одному пути и расширил UrlHelper, чтобы предоставить пути ко всем трем папкам, которые, я думаю, мне могут понадобиться:

public static class ExtensionMethods
{
    private const string ImagesFolder = "~/Images";
    private const string StylesheetsFolder = "~/Stylesheets";
    private const string ScriptsFolder = "~/Scripts";

    public static string Images(this UrlHelper url)
    {
        return url.Content(ImagesFolder);
    }

    public static string Stylesheets(this UrlHelper url)
    {
        return url.Content(StylesheetsFolder);
    }

    public static string Scripts(this UrlHelper url)
    {
        return url.Content(ScriptsFolder);
    }
}

Все хорошо, чтобы пойти ... почти :-) ЯТеперь интересно, есть ли место, где я мог бы определить оператор using MyNamespace.Helper, чтобы эти методы расширения были доступны для всего приложения.В старые времена мы добавляли запись в web.config:

<system.web>
    <pages>
        <namespaces>
            <add namespace="MyNamespace.Helper"/>
        </namespaces>
    </pages>
</system.web>

Это не похоже на работу с Razor :-( Я пытался добавить оператор использования в _ViewStart.cshtml, но тоже не повезло -единственный способ, чтобы мои методы расширения были видны, - это добавить оператор использования на определенной странице, что опять-таки не идеально.

Есть предложения? Кто-нибудь из вас видел объяснение порядка разбора страниц в Razor?& доставка?

1 голос
/ 04 ноября 2015

В представлении _layout

@{
App.AnyName = "abc";
}

В представлении Inherit

@{

    var anyVariable = App.AnyName;

}
1 голос
/ 09 апреля 2013

Используйте свойство PageData:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    PageData.Add("ContentFolder", "~/Content");
}

и внутри _Layout.cshtml:

<%=PageData["ContentFolder"]%>
0 голосов
/ 09 марта 2011

Вы можете использовать встроенное свойство UrlHelper Content:

@Url.Content("~/Content/Stylsheets")
@Url.Content("~/Content/Images")
0 голосов
/ 28 ноября 2010

Просто поместите константы в общедоступный модуль внутри папки app_code или, если вы не хотите этого делать, просто создайте классы в app_code и используйте ключевое слово using (import) для импорта пространства имен (имени класса) в каждом просматривать, и вы можете использовать его таким образом.

В качестве альтернативы, если это имеет смысл сделать, просто добавьте их в свою модель представления - помните, что может не иметь смысла добавлять эти переменные в вашу модель, но может иметь смысл добавлять их в модель представления! Это то, для чего предназначена модель представления, и эта модель представления может извлекать постоянные значения из открытого модуля или класса, или вы можете даже установить это в самой вашей фактической модели представления, таким образом, вы будете определять значения только в одном месте, и вы не нужно использовать импорт пространства имен в каждом представлении:)

Дайте мне знать, как это происходит, и если я еще что-нибудь могу сделать, чтобы помочь вам.

В vb.net, но так же, как csharp, и его легко понять, так как он vb.

Public class YourModel

    // this is where you have the normal model you have... No big deal

End Class

...

// now you make the view model urself

...

Public class MyViewModel

    Public MyNormalModel as YourModel

    //notice we r declaring ur normal model as a variable, u can use a property instead

    Public MyPathConstant1 as string = "abc"

    Public MyPathConstant2 as string = "abc"

    Public MyPathConstant3 as string = "abc"

End Class

Теперь вам нужно установить значение MyNormalModel для вашего экземпляра текущей модели, хотя вы можете сделать это в вашем контроллере, лучше всего создать метод внутри класса MyViewModel, который принимает копию вашей текущей модели в качестве аргумента и выполняет установка MyNormalModel для текущей модели, которую мы только что передали в аргументе.

Вы все еще можете сделать этот вызов в своем контроллере, но, с другой стороны, люди предпочитают вместо передачи всей нормальной модели в качестве свойства просто взять нужные кусочки и части из нормальной модели и поместите их в представление (то есть: вам может понадобиться только половина свойств в нормальной модели, чтобы быть в модели представления). Это потому, что, помните, модель представления будет передана в представление, и они не хотят передавать вещи, которые они не будут использовать :). Но это означает, что вам нужно будет установить каждое из этих свойств наиболее вероятным образом (если только эти точные свойства не инкапсулированы в подкласс, что обычно не происходит случайно).

Я сохранил его в одном, чтобы вы могли просто скопировать обычную модель за один снимок для простоты.

Теперь, когда вы передадите модель представления в ваше представление (MyViewModel), вы сможете использовать и обращаться к нормальной модели через нотацию объекта и его свойства, например ... Model.MyNormalModel.Property1. И т.д. и делайте все, что вы хотите с ним в представлении ... Кроме того, вы можете получить доступ к остальной части вашей модели представления (значения констант, которые мы устанавливаем), как это ... Model.MyPathConstant1 и Model.MyPathConstant2 и т. Д ... Итак у вас есть доступ практически ко всему, что вы хотите, ваша нормальная модель и все, что вы добавили позже, через то, что сейчас называется моделью представления.

Пожалуйста, извините за опечатки - от ipad и lol. Дайте мне знать, если это имеет больше смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...