3

我想我可能在 WebMatrix 的 PageData 中发现了一个错误,但我不确定。它涉及如何将数据从部分页面传递回调用页面。

在 WebMatrix 文档(教程,例如“ 3 - 创建一致的外观”和示例代码)中,建议使用 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

在部分页面中,测试值已修改为Modified entry

返回调用页面后,测试值为 Initial entry

因此,当您返回调用页面时,对 PageData 的部分页面所做的修改会丢失。如果我们在部分页面中向 PageData 添加新条目,也会发生同样的情况。他们只是在返回调用页面时丢失了。

我不知道这种行为是否是错误,或者是否是故意的,但它使您无法将数据从部分页面传递回其调用页面。还有另一种(相对干净的)方法可以做到这一点吗?或者,如果它是一个错误,是否有解决方法?

4

2 回答 2

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";
}
于 2011-05-12T14:35:37.923 回答
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"] 则将使用“布局默认值”

于 2011-02-26T16:33:12.740 回答