Подтвердить что ты не робот

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

Я установил переменную Application в my 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

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

4b9b3361

Ответ 1

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

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-запросы в свои представления.

Ответ 2

@HttpContext.Current.Application["someindex"]

Ответ 3

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

@ApplicationInstance.Application["LICENSE_NAME"]

Однако эта логика не относится к виду.

Ответ 4

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

Ответ 5

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

Мне нужно было загрузить веб-страницу из внешнего ресурса Application Load, которая будет использоваться в качестве навигации заголовка на нескольких сайтах. Это в моем 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;
}

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

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)

Ответ 6

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RouteConfig.RegisterRoutes(RouteTable.Routes);

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

@HttpContext.Current.Application [ "значение" ]

Ответ 7

У меня была эта проблема в контроллере MVC, и я должен был создать полностью квалифицированный HttpContext, чтобы он работал.

System.Web.HttpContext.Current.Application["VarName"]