2011-12-26 14 views
0

部分ビューでは、LoginInfoオブジェクトを保持する変数LoginInfoにアクセスする必要があります。私は以下を試した:部分的な難易度ASP.NET MVC

@LoginInfo info = @(LoginInfo)Session["LoginInfo"] 

しかし、それは私にコンパイラエラーを与える。私は間違って何をしていますか?

答えて

14

私が間違って何をしているのですか?\

多くの事。最初に間違ったのは、Razorの構文です。それは次のようにする必要があります。

@{ LoginInfo info = (LoginInfo)Session["LoginInfo"]; } 

これは単なる構文です。あなたははるかに大きな問題を抱えています。デザインに問題があります。あなたはMVCパターンに違反しています。

ビューでデータを取得しようとしないでください。ビューは、ビューモデルの形式でコントローラアクションから渡されるデータを使用します。

ですから、ビューモデルを定義します。

public class MyViewModel 
{ 
    public LoginInfo LoginInfo { get; set; } 
} 

、あなたはコントローラのアクションがあります。

public ActionResult Foo() 
{ 
    var model = new MyViewModel(); 
    model.LoginInfo = (LoginInfo)Session["LoginInfo"]; 
    return View(model); 
} 

を、あなたは、あなたがビューモデルを使用した強く型付けされたビューを持っています

@model MyViewModel 
<div>Hello @Model.LoginInfo.FirstName</div> 

しかし、この場合(クラス名はLoginInfoとします)、 uはすべてのビューに共通のウィジェットを表示しようとしています。それはHtml.Action helperを使用するための素晴らしい候補になります。

だから、あなたには、いくつかのデータ・ソース(あなたのケースでセッション)からこの情報を取得しますコントローラのアクションを定義:

[ChildActionOnly] 
public ActionResult LoginInfo() 
{ 
    var model = (LoginInfo)Session["LoginInfo"] ?? new LoginInfo(); 
    return PartialView(model); 
} 

をして、あなたが対応する部分を定義します。

@model LoginInfo 
<div>Hello @Model.FirstName @Model.LastName</div> 

そして最後にあなたの_layoutには、このウィジェットをどこかに含めることができます:

@Html.Action("LoginInfo", "SomeController") 
+0

ChildActionOnからわかりません以下では、セッションを部分的に表示できるようにする方法を説明できます – Demodave