Это ошибка в WebMatrix PageData? - PullRequest
3 голосов
/ 26 февраля 2011

Я думаю, что, возможно, нашел ошибку в PageData WebMatrix, но я не уверен. Это касается того, как передать данные с частичной страницы обратно на страницу вызова.

В документации 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>

В результате получается следующее:

Перед вызовом частичной страницы тестовое значение - Начальная запись

На неполной странице значение теста было изменено на Измененную запись

После возврата на страницу вызова, тестовое значение - Начальная запись

Таким образом, модификация частичной страницы, внесенной в PageData, теряется при возврате на страницу вызова. То же самое происходит, если мы добавляем новые записи в PageData на частичной странице. Они просто теряются при возвращении на страницу вызова.

Я не знаю, является ли это поведение ошибочным или намеренным, но оно оставляет вас без чистого способа передать данные с неполной страницы обратно на ее вызывающую страницу. Есть ли другой (относительно чистый) способ сделать это? Или, если это ошибка, есть ли обходной путь?

Ответы [ 2 ]

8 голосов
/ 12 мая 2011

Перекрестная публикация моего ответа от: http://forums.asp.net/t/1667665.aspx/1?Is+this+a+bug+in+WebMatrix+PageData+

Это будет звучать банально, но поведение не является ошибкой.Когда частичная страница инициализируется, ей передается копия словаря PageData, поэтому значения остаются неизменными на исходной странице.

Для совместного использования значений между страницами и частями для жизненного цикла запросаВы могли бы использовать Context.Items.В качестве альтернативы, вы можете поместить словарь или ExpandoObject в PageData и использовать его для обмена значениями:

@{
    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";
}
0 голосов
/ 26 февраля 2011

Ваша страница макета перезаписывает значение, переданное ей с частичной страницы.Для передачи данных с неполной страницы на страницу макета используйте другой индексатор.

Частичная страница

@{
  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"], тогда будет использовано "Layout default value"

...