Razor 这是WebMatrix PageData中的错误吗?

Razor 这是WebMatrix PageData中的错误吗?,razor,webmatrix,Razor,Webmatrix,我想我可能在WebMatrix的PageData中发现了一个bug,但我不确定。 它涉及如何将数据从部分页面传递回调用页面 在WebMatrix文档(教程,例如“”,以及示例代码)中,建议使用PageData作为在页面之间传递数据的机制(例如,从内容页面到布局页面或部分页面) 但是,我发现这并不总是以另一种方式工作,即将数据从部分页面传递回调用页面。在部分页面中修改或添加PageData中的条目似乎不会返回调用页面 将这一点从最简单的示例中切掉,在测试页面中,我们可能会看到: @{ Pa

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

在WebMatrix文档(教程,例如“”,以及示例代码)中,建议使用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>
@{
    PageData["test"] = "Modified entry";
}

<p>In the partial page, the test value has been modified to @PageData["test"]</p>
@{
PageData[“测试”]=“初始条目”;
}
在调用部分页面之前,测试值为@PageData[“test”]

@RenderPage(“\u TestPartial.cshtml”) 返回调用页面后,测试值为@PageData[“test”]

在_TestPartial.cshtml页面中,我们可能会看到:

@{
    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>
@{
    PageData["test"] = "Modified entry";
}

<p>In the partial page, the test value has been modified to @PageData["test"]</p>
@{
PageData[“测试”]=“修改的条目”;
}
在部分页面中,测试值已修改为@PageData[“test”]

结果输出如下:

在调用部分页面之前,测试值是初始条目

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

返回调用页面后,测试值为初始条目

因此,当您返回到调用页面时,对PageData进行的部分页面修改将丢失。如果我们在部分页面的PageData中添加新条目,也会发生同样的情况。他们在返回呼叫页面时丢失了


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

布局页面正在覆盖从部分页面传递给它的值。要将数据从部分页面传递到布局页面,请使用其他索引器

部分页

@{
  PageData["test"] = "value form partial";
}
@{
  PageData["test"] = "partial page value";
}
版面页

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

从以下位置交叉发布我的响应:

这听起来有些陈词滥调,但这种行为是经过设计的,不是一个bug。初始化部分页面时,会将PageData字典的副本传递给它,这就是为什么这些值在原始页面中不受影响的原因

要在请求的生命周期中跨页面和部分共享值,可以使用Context.Items。或者,您可以在PageData中插入字典或ExpandooObject,并使用它共享值:

@{
    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";
}
@{
第[“共享”]=新字典();
页面共享[“标题”]=“测试”;
@第[“共享”][“标题”]
@渲染页面(“~/Partial.cshtml”)
@第页共享[“标题”]
}
//Partial.cshtml
@{
页面共享[“标题”]=“更新的标题”;
}

对不起,大卫,但这个答案没有抓住重点。这个问题与页面布局无关。我的示例不使用布局页面,将数据从页面传递到布局页面也没有问题。我认为这里可能对我的术语有误解。我所说的“部分页面”并不是指包装在布局页面中的页面。我指的是通过使用@RenderPage()调用包含在较大页面中的页面的一小部分(如我的示例所示)。问题是,一旦您离开部分页面,设置在部分页面的PageData中的值就会完全丢失。感谢您的回答,这是有道理的,但这种行为还远远不明显。在文档/MSDN/还有什么地方我可以找到它呢?有一些文档说明了它在MSDN中是如何工作的-但是它没有太多地说明这个特定的行为。有没有可能解释一下为什么PageData中的字典工作,而PageData[“test”]不工作?它是通过参考而不是通过价值来实现的吗?