Is this a bug in WebMatrix PageData?
我想我可能在webmatrix的pagedata中发现了一个bug,但我不确定。它涉及如何将数据从一个部分页面传回一个调用页面。
在WebMatrix文档(教程,例如"3-创建一致外观"和示例代码)中,建议将pageData作为在页面之间传递数据(例如,从内容页面到布局页面或部分页面)的机制。
但是,我发现,这并不总是以另一种方式工作,即将数据从一个部分页传递回调用页。在部分页中修改或添加pagedata中的条目,似乎无法返回到调用页。
在测试页中,我们可以用一个最简单的例子来说明这一点:
1 2 3 4 5 6 7 8 9 10 11 12 13 | @{ 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> |
在testpartal.cshtml页面中,我们可能会看到:
1 2 3 4 5 6 7 | @{ PageData["test"] ="Modified entry"; } <p> In the partial page, the test value has been modified to @PageData["test"] </p> |
产生的结果是:
Before calling the partial page, the test value is Initial entry
In the partial page, the test value has been modified to Modified entry
After returning to the calling page, the test value is Initial entry
因此,当您返回调用页时,对pagedata所做的部分页的修改将丢失。如果在部分页面中向pagedata添加新条目,也会发生同样的情况。他们刚回到呼叫页面就迷路了。
我不知道这种行为是否是一个bug,或者它是故意的,但是它让您无法用一种干净的方式将数据从一个部分页传递回它的调用页。有没有其他(相对干净的)方法可以做到这一点?或者,如果是一个bug,是否有解决方法?
交叉发布我的回复:http://forums.asp.net/t/1667665.aspx/1?在+webmatrix+pagedata中+this+a+bug++
这听起来有点陈词滥调,但行为是由设计造成的,而不是一个bug。当初始化部分页时,会向其传递一份pagedata字典的副本,这就是为什么值在原始页中不受影响的原因。
要在请求的生命周期中跨页面和部分共享值,可以使用context.items。或者,您可以将字典或expandoobject放入pagedata中,并使用它来共享值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @{ 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 2 3 | @{ PageData["test"] ="value form partial"; } |
布局页面
1 2 3 4 5 6 7 8 9 | @{ PageData["anothertest"] ="value from layout"; } <p> test value = @PageData["test"] </p> <p> anothertest value = @PageData["anothertest"] </p> |
如果要在布局页中显示一个默认值(如果部分页未设置该值),则可以执行以下操作
布局页面
1 2 3 4 5 6 | @{ var test = PageData["test"] ??"Layout default value"; } <p> test value = @test </p> |
部分页面
1 2 3 | @{ PageData["test"] ="partial page value"; } |
如果部分页面未设置pagedata["test"],则将使用"布局默认值"