2011-02-26 49 views
3

我想我可能在WebMatrix的PageData中發現了一個錯誤,但我不確定。 它涉及如何將數據從部分頁面傳遞迴調用頁面。這是WebMatrix PageData中的錯誤嗎?

在WebMatrix文檔(教程,例如「3 - Creating a Consistent Look」和示例代碼)中,推薦PageData作爲頁面之間傳遞數據的機制(例如從內容頁面到佈局頁面或部分頁面)。

但是,我發現這並不總是以另一種方式工作,將數據從部分頁面傳遞迴調用頁面。在部分頁面中修改或添加PageData中的條目似乎無法返回到調用頁面。

切割這對倒的可能最簡單的例子,在一個測試頁面,我們可能有這樣的:

@{ 
    PageData["test"] = "Initial entry"; 
} 

<p>Before calling the partial page, the test value is @PageData["test"]</p> 

@RenderPage("_TestPartial.cshtml") 

<p>After returning to the calling page, the test value is @PageData["test"]</p> 

,並在_TestPartial.cshtml頁面,我們可能有這樣的:

@{ 
    PageData["test"] = "Modified entry"; 
} 

<p>In the partial page, the test value has been modified to @PageData["test"]</p> 

的產生的輸出是:

在調用部分頁面之前,測試值是初始條目

在部分頁,測試值已經被修改爲修改的項

返回調用頁面之後,將試驗值是初始入口

從而使局部頁面PageData進行的修改當您返回到呼叫頁面時會丟失。如果我們在部分頁面中向PageData添加新條目,也會發生同樣的情況。回到呼叫頁面時,他們只是迷失了方向。

我不知道這個行爲是一個錯誤,還是它是故意的,但它沒有一個乾淨的方式將數據從部分頁面傳回到其調用頁面。是否有另一種(相對乾淨)的方式來做到這一點?或者,如果它是一個錯誤,是否有解決方法?

回答

8

交叉張貼從我的迴應:http://forums.asp.net/t/1667665.aspx/1?Is+this+a+bug+in+WebMatrix+PageData+

這聽起來很古怪,但這種行爲是通過設計而不是bug。當部分頁面初始化時,PageData字典的副本將傳遞給它,這就是爲什麼值在原始頁面中保持不受影響的原因。

要在請求的生命週期中跨頁面和部分共享值,可以使用Context.Items。或者,你可以在一本字典或內部PageData的ExpandoObject下降,並用它來共享價值觀:

@{ 
    Page["Shared"] = new Dictionary<string, string>(); 
    Page.Shared["Title"] = "Test"; 
    @Page["shared"]["Title"] 

    @RenderPage("~/Partial.cshtml") 

    @Page.Shared["Title"] 
} 

// Partial.cshtml 
@{ 
    Page.Shared["Title"] = "Updated title"; 
} 
+0

感謝您的回答,這是有道理的,但這種行爲是遠不明顯的。 在文檔/ MSDN /其他地方我會去找出來嗎? –

+0

關於它如何在MSDN中運行有一些文檔 - http://msdn.microsoft.com/en-us/library/system.web.webpages.webpagebase.page(v=VS.99).aspx但它沒有對這種特別的行爲沒有太多的說法。 – Pranav

+0

解釋爲什麼PageData中的字典能夠正常工作,但PageData [「test」]不能解釋的機會?它是由參考而不是由價值決定的嗎? – johna

0

佈局頁面將覆蓋傳遞給它的值,形成部分頁面。要將數據從部分頁面傳遞到佈局頁面,請使用不同的索引器。

部分頁

@{ 
    PageData["test"] = "value form partial"; 
} 

佈局頁

@{ 
    PageData["anothertest"] = "value from layout"; 
} 
<p>test value = @PageData["test"]</p> 
<p>anothertest value = @PageData["anothertest"]</p> 

如果你想有,如果你的部分頁面不設置值,則可以顯示的頁面佈局的默認值請執行下列操作

佈局頁

@{ 
    var test = PageData["test"] ?? "Layout default value"; 
} 
<p>test value = @test</p> 

部分頁

@{ 
    PageData["test"] = "partial page value"; 
} 

如果您的部分頁面不設置PageData [「測試」],然後將使用「佈局默認值」

+0

對不起大衛,但這個答案切中要害。這個問題與佈局頁面無關。我的例子不使用佈局頁面,並且將數據從頁面傳遞到佈局頁面沒有問題。我認爲這裏可能會誤解我的術語。通過「部分頁面」,我不是指一個頁面,然後包裝在佈局頁面中。我的意思是通過使用@RenderPage()調用包含在更大頁面中的頁面的一小部分(如我的示例演示)。問題在於,一旦離開部分頁面,設置在PageData中的部分頁面的值將完全丟失**。 –