2010-06-21 98 views
3

好吧,我很確定我知道這個答案,但以防萬一。將兩個值傳遞給視圖

我知道我可以將一個複合類傳遞給視圖/局部視圖。我的問題是,我可以在沒有模型的情況下傳遞一個對象。

因此,像Html.RenderPartial("MyPartialView", new { id=10, name="slappy" });

如果可以,將在局部視圖是什麼樣子?

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<?????>" %> 

以及如何訪問屬性?

Model.id??? 

編輯

只是跟進基於@ Graphain的解決方案,這是我的觀點;

<% Html.RenderPartial("PagedList", new { id="10" }); %> 

在我的部分視圖中,我有這個;

[<%= ViewData["id"] %>] which renders [];

然而,

<%= Html.TextBox("id") %> 

給了我一個數字10的文本框。

回答

3

當然。

你的部分觀點的聲明應該是這樣的:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 

你會喜歡這個訪問屬性:

<%=ViewData.Eval("id")%> 

您將使用ViewUserControl而非ViewUserControl(Of TModel)

這意味着你將要訪問一個ViewDataDictionary,而不是一個ViewDataDictionary(Of TModel),將與只是普通的對象數據,而不是強類型數據處理(以及字符串鍵,而不是強類型的屬性名稱)。

This link是上的差異很好的介紹:

第一種類型的ViewDataDictionary 的是無類型集合包括 一個字符串和一個對象。字符串 代表密鑰,對象 保存實際數據。與任何 無類型集合一樣,該對象可以是任何類型的 ,但在使用前必須轉換爲 正確的類型。項目 通過其 ViewUserControl的 ViewData屬性中的密鑰引用(在 部分視圖的情況下)。第二個是強烈的 鍵入的集合,其中項目是 ViewProperty.Model屬性的屬性。

+0

視圖數據不存在於我的部分視圖中。 – griegs 2010-06-21 04:36:57

+0

所以如果你去ViewData [「ID」]或ViewData [「slappy」]沒有出現? – 2010-06-21 04:40:42

+1

是的,這是正確的。我在我看來有這個<%Html.RenderPartial(「PagedList」,new {id =「10」}); %>和在我的PV我有[<%= ViewData [「id」]%>],我看到的全部是[] – griegs 2010-06-21 04:42:13

-1

我不認爲你可以使用Anonymous類作爲ViewData。

+0

是的,這就是我找到的。來自@Graphain的代碼一直運行直到我運行它。 :) ViewData沒有出現。 – griegs 2010-06-21 04:36:33

+1

通過使用基於字符串的索引器ViewData [「someProperty」],您可以確定使用ViewData訪問該匿名類型的屬性。這是Graphain的帖子顯示的。 – Eilon 2010-06-21 04:38:17

0
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ExpandoObject>" %> 

在你的控制器:

var model = new ExpandoObject(); 
model.id = 1; 
model.name = "John"; 
model.DynamicAttrs = "anything dynamic"; 

也許你感到困惑的是,爲什麼我們不使用:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %> 

理論上給出了一個模型,它的類型是動態的。但是在這裏我們不能這樣做,因爲動態類型被生成爲「內部」,您無法在視圖中訪問它。所以我們改用ExpandoObject。