2014-09-30 4 views
1

ASP.NET MVC 앱을 만들고 있습니다. 동일한 데이터를 사용하는 여러보기가 있습니다. 이러한 이유로, 내 컨트롤러에서 ViewBag를 채우기위한 공유 함수를 만들 것이라고 생각했습니다. 현재, 나는 다음과 같은 노력하고있어 :ASP.NET MVC에서 ViewBag로드하기

public async Task<ActionResult> Create() 
{ 
    await LoadViewBag(); 
    return View(); 
} 

public async Task<ActionResult> Edit(int id) 
{ 
    await LoadViewBag(); 
    return View(); 
} 

private async Task<bool> LoadViewBag() 
{ 
    ViewBag.PossibleTypes = await MyType.GetAllFromDatabase(); 
    ViewBag.PossibleContacts = await Contact.GetAllFromDatabase(); 
    ViewBag.InvitedBy = GetFullName(); 

    return true; 
} 

내보기에, 나는 다음과 같습니다

@Html.Raw(ViewBag.InvitedBy) 

불행하게도, InvitedBy에 넣어 값이보기에 표시되지 않습니다. 나는 중단 점을 설정하고 제대로 설정된 것처럼 보입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

중단 점은 사용할 수 있습니다 볼 다음에? 보기를 게시 할 수 있습니까? – Floremin

+0

공유 함수 대신 각각의'ActionResult'에서'ViewBag.InvitedBy'의 값을 설정하면 어떻게됩니까? 보기에 표시됩니까? –

+0

ASP.NET 4.5를 사용하고 있고,'app.config'에서'httpRuntime.targetFramework'을'4.5'로 설정했는지 확인하십시오. –

답변

1

ViewBag의 값은 현재 요청에 대해서만 유효합니다. 코드는 async Task으로 리디렉션되어 ViewBag의 값을 설정합니다. ViewBag에 대해 설정 한 값은 해당 요청과 함께 사망합니다.

대신 공유 함수 대신 해당 ActionResult에서 ViewBag의 값을 설정하면 해당 함수는 생존하고 뷰의 값을 가져옵니다.

대신 TempData을 사용해보십시오. TempData은 내부적으로 세션을 사용하여 값을 저장합니다.

private async Task<bool> LoadViewBag() 
{ 
    ... 
    ... 
    TempData["InvitedBy"] = GetFullName(); 

    return true; 
} 

당신은 당신이

@if (TempData["InvitedBy"] != null) 
{ 
    @Html.Raw(@TempData["Message"]) 
} 
+0

내 컨트롤러와 뷰를 연결하는 데 사용할 수있는 동적 유형이 있습니까? TempData 문제는 사전으로 각 요소가 개체입니다. Convert.ToString (TempData [ "SomeKey"]);을 잔뜩 가지고 결국이 내보기를 오염시킵니다. – user687554

+0

@ user687554 나는 ViewBag가 동적 인 프로퍼티이고, 각각의 객체로부터 타입을 자동으로 파생하지만 ViewBag의 단점을 수용해야하므로 타입 캐스팅이 필요 없다는 것에 동의한다. 따라서 ViewBag/ViewData/TempData 대신보기 모델과 강력한 형식의보기를 사용해야합니다. –