2014-09-30 79 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 2014-09-30 16:50:24

+0

如果您在各自的「ActionResult」中設置「ViewBag.InvitedBy」的值而不是共享函數,會發生什麼情況?它是否顯示在視圖上? – 2014-09-30 16:50:36

+0

確保您使用的是ASP.NET 4.5,並在'app.config'中將'httpRuntime.targetFramework'設置爲'4.5'。 – 2014-09-30 17:02:47

回答

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 2014-09-30 18:37:55

+0

@ user687554我同意ViewBag是一個動態屬性,你不需要類型轉換,因爲它會自動從各個對象派生類型,但是你也必須接受ViewBag的缺點。這就是爲什麼你應該使用視圖模型和強類型視圖而不是ViewBag/ViewData/TempData。 – 2014-09-30 20:44:08