2011-12-26 4 views
0

부분보기에서 LoginInfo 개체를 보유하는 변수 LoginInfo에 액세스해야합니다. 나는 다음을 시도했다 :부분보기 어려움 ASP.NET MVC

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

그러나 그것은 나에게 컴파일러 오류를 준다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 내가 잘못 뭐하는 거지

답변

14

? \

많은 것들. 당신이 잘못한 첫 번째 일은 면도기 구문입니다. 다음과 같아야합니다.

@{ 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