Как получить доступ к переменным приложения в 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
Каков правильный синтаксис?
Ответы
Ответ 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"]