Как получить доступ к переменным приложения в виде бритвы asp.net mvc 3? - PullRequest
27 голосов
/ 13 марта 2011

Я устанавливаю переменную Application в моем global.asa.cs с помощью:

    protected void Application_Start()
    {
        ...

        // load all application settings
        Application["LICENSE_NAME"] = "asdf";

    }

, а затем пытаюсь получить доступ с помощью моего вида бритвы следующим образом:

@Application["LICENSE_NAME"]

и получаю этоошибка:

Compiler Error Message: CS0103: The name 'Application' does not exist in the current context

каков правильный синтаксис?

Ответы [ 6 ]

65 голосов
/ 13 марта 2011

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

public class MyViewModel
{
    public string LicenseName { get; set; }
}

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

public ActionResult Index()
{
    var model = new MyViewModel
    {
        LicenseName = HttpContext.Application["LICENSE_NAME"] as string
    };
    return View(model);
}

и, наконец, ваш строго типизированный вид отображает эту информацию для пользователя:

<div>@Model.LicenseName</div>

Это правильный шаблон MVC, и вот как это должно быть сделано.

Избегайте представлений, которые извлекают данные как вредные, потому что сегодня это состояние приложения, завтра - цикл foreach, на следующей неделе - запрос LINQ, и вы сразу же будете писать запросы SQL в своих представлениях.

23 голосов
/ 13 марта 2011
@HttpContext.Current.Application["someindex"]
6 голосов
/ 13 марта 2011

Вы можете получить текущее приложение, используя автоматически сгенерированное ApplicationInstance свойство :

@ApplicationInstance.Application["LICENSE_NAME"]

Однако эта логика не принадлежит представлению.

5 голосов
/ 13 марта 2011

Вы должны иметь возможность получить доступ к этому через HttpContext.Current.Application[], однако лучшие практики MVC заявят, что вам, вероятно, следует рассмотреть возможность передачи этого через вашу модель представления.

4 голосов
/ 07 октября 2011

Опираясь на шаблон @Darin-Dimitrov, отвеченный выше, я передал модель в частичное представление, которое я загрузил на страницу _Layout.

Мне нужно было загрузить веб-страницу из внешнего ресурса при загрузке приложения, который будет использоваться в качестве заголовка навигации по нескольким сайтам.Это в моем Global.asax.cs

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    Application["HeaderNav"] = GetHtmlPage("https://site.com/HeaderNav.html");
}

static string GetHtmlPage(string strURL)
{
    string strResult;
    var objRequest = HttpWebRequest.Create(strURL);
    var objResponse = objRequest.GetResponse();
    using (var sr = new StreamReader(objResponse.GetResponseStream()))
    {
        strResult = sr.ReadToEnd();
        sr.Close();
    }
    return strResult;
}

Вот мой контроллер Action для частичного представления.

public class ProfileController : BaseController
{
    public ActionResult HeaderNav()
    {
        var model = new Models.HeaderModel
        {
            NavigationHtml = HttpContext.Application["HeaderNav"] as string
        };
        return PartialView("_Header", model);
    }
}

Я загрузил частичное представление на странице _Layout следующим образом.

<div id="header">
     @{Html.RenderAction("HeaderNav", "Profile");}
</div>

Частичное представление _Header.cshtml очень просто и загружает html из переменной приложения.

@model Models.HeaderModel
@MvcHtmlString.Create(Model.NavigationHtml)
1 голос
/ 14 февраля 2017
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RouteConfig.RegisterRoutes(RouteTable.Routes);

        var e = "Hello";
        Application["value"] = e;
    }

@HttpContext.Current.Application ["value"]

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