2011-04-20 46 views
47

我有一個控制器調用視圖。在視圖中有一個PartialView叫做@Html.Partial("ViewName", model).這工作正常。無法在ASP.NET MVC3的局部視圖中訪問ViewBag

但是在controller我希望在viewbag中放些什麼東西很難放入視圖模型中。 主視圖訪問ViewBag沒有問題,但在PartialView它不返回任何內容。

是否有可能在這種情況下使用ViewBag或我應該「黑客」這個數據到我傳遞到視圖的模型(我傳遞給PartialView模型,並且模型我傳遞給嵌套在PartialView第一個PartialView)?

+0

有關動態的一件事就是它區分大小寫 – Buildstarted 2011-04-20 15:07:08

+5

我非常愚蠢的是,我真的爲這個非常糟糕的問題贏得了金徽章。我有點慚愧。 – SoonDead 2013-02-22 12:10:35

+0

我的錯誤是,我在鏈中使用了@ Html.Action而沒有記住它。 – SoonDead 2011-04-21 05:43:55

回答

35

這應該沒有任何問題。在我的HomeController中Index操作我想補充一個信息,ViewBag:

ViewBag.Message = "Welcome to ASP.NET MVC!"; 

在索引視圖我添加了局部視圖:

@Html.Partial("ViewName") 

而且在局部視圖我渲染消息:

@ViewBag.Message 

完美地工作。你還幹了什麼?可能是打字錯誤?

+26

我發現如果您使用@ Html.Partial(「ViewName」,Model),那麼viewbag的其餘部分將不可用。 – 2012-07-17 18:53:15

+2

你確定嗎?對我來說,只有當你指定顯式的viewData時纔是這種情況。像這樣:@ Html.Partial(「ViewName」,Model,ViewData)否則ViewBag是完全可訪問的。 – 2013-04-30 09:05:50

+20

我知道這有點舊,但爲了將來的參考,我通過使用'ViewContext.Controller.ViewBag.Property'解決了這個問題。當然這意味着你試圖訪問的'ViewBag'屬性是在控制器中設置的,但我認爲這是一個常見的情況。 – TehOne 2013-05-15 19:47:17

28

如果使用的Html.Partial()其中viewData是輸入參數中的一個的過載,例如:

@Html.Partial("PartialViewName", Model, new ViewDataDictionary(ViewBag)) 

那麼你的局部視圖不會從原始ViewBag看到數據。

刪除new ViewDataDictionary(ViewBag),所以你應該寫

@Html.Partial("PartialViewName", Model) 
+1

請注意,我已經找到了錯誤的原因,所以這個答案可能有點難以具有任何相關性。 – SoonDead 2013-06-17 12:15:17

+9

@SoonDead但這個答案仍然相關谷歌來這裏:) – 2013-10-17 15:09:13

+0

@EvgenyLevin這是真的。 – SoonDead 2013-10-17 15:16:15

8

在評論TehOne說:

我知道這是有點老了,但對於未來的參考,我使用ViewContext解決了這個由 .Controller.ViewBag.Property。當然這意味着 您嘗試訪問的ViewBag屬性在 控制器中設置,但我認爲這是一個常見的情況。

這是爲我工作。

7

最近我遇到了同樣的問題,但這裏的答案只是解決方法,因爲他們建議不要使用viewDataHtml.Partial過載。但是,如果你不得不使用這些重載我認爲正確的答案是:

@Html.Partial(
    "PartialViewName", 
    model_object, 
    new ViewDataDictionary() { { "Value1InViewBag", ViewBag.Value1InViewBag }, { "Value2InViewBag", ViewBag.Value2InViewBag } } 
) 

我認爲,如果你需要通過不同的這個答案應該使用ViewDataDictionary(如我我們來說,改變HtmlFieldPrefix),並因爲在視圖你應該知道,ViewBag需要什麼局部視圖,所以將ViewBag中的所有參數都複製到局部視圖中使用的新的ViewBag(顯然ViewBag使用的值爲ViewData)應該不是問題。

0

我的塞納里奧是,我曾與型號IEnumerable<SampleModel> 局部視圖,但是我不得不用,怎麼Model.SampleModelList可以null

@Html.Partial("PartialViewName", Model.SampleModelList, new ViewDataDictionary()) 

簡單的解決方案是通過自PartialView現在也考慮每一個的一部分View上的元素可以通過PartialView訪問,所以我沒有將ViewBag數據設置爲View html上的數據元素,而不是ViewBag。

<div class="showcase-heading" id="dvValue" data-id="@Model.ContentId">@Model.Name</div> 
0

我有同樣的問題與一個非常基本的網頁:

@Html.Partial("_AppIntro") 

<div class="form-group row"> 
    <div class="col-md-10"> 
     <a href="/Ag/Application/1" class="btn btn-default btn-primary">Next</a> 
    </div> 
</div> 

而且局部視圖只包含有對ViewBag一些參考文本來從控制器通過一些動態值。原來,局部視圖的名稱很重要。刪除局部頁面並使用添加 - >視圖 - > MVC 5視圖重新創建,但命名頁面_AppIntro.cshtml修復了它。