我想我可能在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中,则会发生同样的情况。它们只是在返回到调用页面时丢失。
我不知道此行为是否是错误,或者是否是故意的,但这使您无法采用干净的方法将数据从部分页面传递回其调用页面。还有另一种(相对干净的)方法吗?或者,如果是错误,是否可以解决?
最佳答案
交叉发布我的回复:http://forums.asp.net/t/1667665.aspx/1?Is+this+a+bug+in+WebMatrix+PageData+
这听起来很陈旧,但是行为是设计使然,而不是错误。初始化部分页面时,会将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";
}