2011-10-20 3 views
3

В попытке получить мой мозг вокруг RenderPage v. Html.Partial v. Html.RenderPartial, я играл с некоторыми тестовыми файлами. Я столкнулся с каким-то странным поведением: как только RenderPage() вызывается, кажется, что все последующие вызовы Html.RenderPartial() становятся no-ops. Почему один предотвращает другого?MVC Razor RenderPage предотвращает использование Html.RenderPartial для последующего использования

Foo.cshtml:

<div>foo</div> 

Bar.cshtml:

<div>bar</div> 

Test1.cshtml:

@{ 
    Layout = null; 
} 
<!DOCTYPE html> 
<html> 
<head> 
    <title>Test</title> 
</head> 
<body> 
    @{ Html.RenderPartial("Foo"); } 
    @RenderPage("Bar.cshtml") 
</body> 
</html> 

Test2.cshtml:

// Test2.cshtml is identical to Test1.cshtml, except the two lines below 
// ... 
<body> 
    @RenderPage("Bar.cshtml")  // this line used to be second 
    @{ Html.RenderPartial("Foo"); } // this line used to be first 
</body> 

Test1 ведет себя точно так, как вы ожидали:
foo
bar

Однако Test2 никогда не делает «foo»; это как если бы мой призыв к @ {Html.RenderPartial ("Foo"); } никогда не бывает.

Я понимаю, что этот пример надуман - я не ищу способы исправить проблему. Я пытаюсь понять, как связаны RenderPage и Html.RenderPartial, и почему они мешают друг другу.

ответ

2

вы можете проверить this из

как было упомянуто Аннабель:

Html.Partial("MyView") 

Отрисовывает "MyView" вид на MvcHtmlString. Он следует стандартным правилам просмотра вида (например, проверить текущий каталог, затем проверить общий каталог).

Html.RenderPartial("MyView") 

Выполняет то же, что и Html.Partial(), за исключением того, что он записывает свой вывод непосредственно в поток ответов. Это более эффективно, поскольку содержимое представления не буферизируется в памяти. Однако, поскольку метод не возвращает никакого вывода, @ Html.RenderPartial («MyView») не будет работать. Вместо этого вы должны перевести вызов в блок кода: @ {Html.RenderPartial ("MyView");}.

RenderPage("MyView.cshtml") 

Отображает заданный вид (идентифицированный путь и имя файла, а не по имени представления) непосредственно в поток ответа, как Html.RenderPartial(). Однако, как представляется, модель текущего представления всегда использует модель «MyView.cshtml».

, а также глядя на here вы можете узнать, что: метод @RenderPage из WebPageBase не использует MVC шаблон поиска и получаете точный путь к шаблонам в качестве параметра

Смежные вопросы