这是WebMatrix PageData中的错误吗?

Nev*_*ook 3 webmatrix razor

我想我可能在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>
Run Code Online (Sandbox Code Playgroud)

在_TestPartial.cshtml页面中我们可能会这样:

@{
    PageData["test"] = "Modified entry";
}

<p>In the partial page, the test value has been modified to @PageData["test"]</p>
Run Code Online (Sandbox Code Playgroud)

结果输出如下:

在调用部分页面之前,测试值为Initial entry

在部分页面中,测试值已修改为修改条目

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

因此,当您返回到调用页面时,部分页面对PageData的修改将丢失.如果我们在部分页面中向PageData添加新条目,则会出现同样的情况.它们在返回调用页面时丢失了.

我不知道这种行为是否是一个错误,或者它是否是有意的,但它让你没有一种干净的方式将数据从部分页面传递回其调用页面.还有另一种(相对干净的)方法吗?或者,如果它是一个bug,是否有解决方法?

Pra*_*nav 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";
}
Run Code Online (Sandbox Code Playgroud)