这是WebMatrix PageData中的错误吗?

时间:2011-02-26 13:56:37

标签: razor webmatrix

我想我可能在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,是否有解决方法?

2 个答案:

答案 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”],则将使用“布局默认值”