我想我可能在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>
结果输出为:
在调用部分页面之前,测试值为初始条目
在部分页面中,测试值已修改为修改条目
返回调用页面后,测试值为Initial entry
因此,当您返回到调用页面时,部分页面对PageData的修改将丢失。如果我们在部分页面中向PageData添加新条目,也会出现同样的情况。它们在返回呼叫页面时就丢失了。
我不知道这种行为是否是一个错误,或者是否是故意的,但是它没有一种干净的方式将数据从部分页面传递回其调用页面。还有另一种(相对干净的)方法吗?或者,如果它是一个bug,是否有解决方法?
答案 0 :(得分:8)
交叉发布我的回复: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";
}
答案 1 :(得分: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 [“test”],则将使用“布局默认值”