web-dev-qa-db-ja.com

asp.net mvc 3カミソリビューでアプリケーション変数にアクセスするにはどうすればよいですか?

Global.asa.csにApplication変数を設定します:

    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

適切な構文は何ですか?

27
Chris

ビューはどこからでもデータをプルすることを想定していません。コントローラアクションからビューモデルの形式で渡されたデータを使用することになっています。したがって、ビューでそのようなデータを使用する必要がある場合、適切な方法はビューモデルを定義することです。

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クエリを書くことになります。

65
Darin Dimitrov
@HttpContext.Current.Application["someindex"]
23
Zach Green

自動的に生成された ApplicationInstance property を使用して、現在のアプリケーションを取得できます。

@ApplicationInstance.Application["LICENSE_NAME"]

ただし、このロジックはビューに属していません。

6
SLaks

HttpContext.Current.Application[]を介してこれにアクセスできる必要がありますが、MVCのベストプラクティスでは、おそらくこれをビューモデルに渡すことを検討する必要があると述べています。

5
Keith

上記で回答した@ Darin-Dimitrovパターンに基づいて、モデルを部分ビューに渡し、_Layoutページにロードしました。

Application Loadの外部リソースからWebページを読み込む必要がありました。これは、複数のサイトにわたるヘッダーナビゲーションとして使用されます。これは私の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)
4
Josh Simerman
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RouteConfig.RegisterRoutes(RouteTable.Routes);

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

@ HttpContext.Current.Application ["value"]

1
Rohul Amin