ASP.NET MVC 3 RC — свойство Razor View

Просто возился с Razor в выпуске ASP.NET MVC 3 RC, выпущенном сегодня.

Теперь у нас есть концепция «страницы макета», которая, как я полагаю, является заменой «мастера просмотра» в механизме просмотра ASPX.

Но я не понимаю свойство «Просмотр» страницы макета.

Вот пример, который создается при создании нового Razor View:

_Layout.cshtml

<html>
<head>
   <title>@View.Title</title>

...

MyView.cshtml

@model Mvc3FunParty.Models.Post

@{
   View.Title = "Some Title";
   Layout = "~/Views/Shared/_Layout.cshtml";
}

Это приводит к тому, что «Some Title» вставляется в тег <title> отображаемого HTML.

Как же это работает? Когда я навожу курсор на свойство «Вид», оно имеет тип «динамический».

Итак, для чего именно следует использовать это свойство? Мы можем что-нибудь туда засунуть? Предполагается ли, что это реализация Razor для ViewData?

И если да, то не должен ли он быть типа "ViewDataDictionary"? Почему тип «динамический» для свойства «Просмотр»?


person RPM1984    schedule 10.11.2010    source источник
comment
а также, кстати, у кого-нибудь были проблемы с intellisense? Я использую Resharper, но проверил настройку в VS2010 (завершение оператора). Я получаю intellisense, когда делаю Model., но не когда печатаю.   -  person RPM1984    schedule 10.11.2010
comment
Если вы не определите тип своей модели (через @model MyModel), свойство Model будет типизировано как динамическое (по крайней мере, в С#)   -  person marcind    schedule 10.11.2010
comment
Кроме того, инструменты Razor не всегда работают с Resharper.   -  person marcind    schedule 10.11.2010
comment
Да, я использую @model MyModel (как и в вопросе). Модель строго типизирована для объекта Post. Так что это не проблема. Но я бы хотел, если бы я набрал Model.Po .. я бы получил intellisense для любых свойств, содержащих Po. Я должен нажать CTRL+. чтобы получить это. Ну, лучше, чем ничего, я думаю. :)   -  person RPM1984    schedule 10.11.2010
comment
Для всех, кому небезразлично, Razor intellisense — это ошибка Resharper: blogs.jetbrains.com/dotnet/2010/11/ Скоро появится исправление — пока CTRL-Пробел. :(   -  person RPM1984    schedule 12.11.2010
comment
Похоже, Razor intellisense не появится в ReSharper в ближайшее время — читайте на их сайте, что он будет готов только с R # 6 примерно весной. До тех пор они предлагают либо вызывать intellisense вручную, либо полностью переключиться на VS intellisense.   -  person Dav    schedule 29.11.2010
comment
@Dav - да, я вызываю вручную (CTRL-Пробел). Но это отстой, потому что мы не видим перегрузку метода intellisense. Поэтому, если я делаю @Html.LabelFor( CTRL-Пробел, я не вижу перегрузок для метода.   -  person RPM1984    schedule 30.11.2010


Ответы (2)


Да, «Просмотр» на самом деле ViewData, и они используют dynamic, чтобы иметь синтаксис, который вы видите (View.Title)

Это переводится как

ViewData["Title"]

В MVC и особенно в MVC 3 много таких маленьких самородков, которые вас смутят :).

person Shiv Kumar    schedule 10.11.2010
comment
Хорошо, но мы никогда не использовали ViewData["Title"] для создания данных в разметке, мы использовали его перед обработкой результата в контроллере и отображением значения в представлении. Вот почему я запутался, потому что на самом деле он создает данные в самом представлении (или так кажется) - person RPM1984; 10.11.2010
comment
В веб-страницах ASP.NET (автономная версия Razor, например, та, что использует WebMatrix) нет контроллера, поэтому значения должны быть установлены встроенными - person John Sheehan; 10.11.2010
comment
Кроме того, я добавил ViewModel.Title = "Foo" к действию контроллера и исключил его из страницы просмотра, и он принял значение Foo. Если я оставлю код на странице просмотра, он переопределит значение, установленное контроллером. Интересный... - person RPM1984; 10.11.2010
comment
Вы можете установить значения ViewData внутри представления. ViewData передаются от контроллера к представлению, поэтому последнее слово, когда дело доходит до перезаписи значений, остается за представлением. - person Omar; 10.11.2010
comment
Выигрывает последний. То есть порядок или последовательность: Controller, View, Layout. Поэтому, если вы установите значение в своих ViewData в контроллере, а затем установите его на что-то еще в своем представлении, значение, которое вы установили в своем представлении, перезапишет то, что у вас было раньше. Наконец, ваша страница макета получает значение и использует его для отображения. Это имеет смысл? - person Shiv Kumar; 10.11.2010
comment
Да, это имеет смысл. Спасибо. - person RPM1984; 10.11.2010
comment
@Shiv Kumar - я ждал, чтобы увидеть, какой из двух ответов набрал наибольшее количество голосов, поскольку оба были правильными. Однако, поскольку у обоих по 1 голосу, а вы заняли первое место, я отдаю его вам. Спасибо за вашу помощь. :) - person RPM1984; 11.11.2010

Свойство View является псевдонимом свойства ViewData. Это означает, что следующий код

View.Title

эквивалентно

ViewData["Title"]

Это работает с использованием новой «динамической» функции языка C#, представленной в .NET 4. По сути, это позволяет вам писать код с поздним связыванием на том, что до сих пор было языком со статической типизацией. В Интернете есть множество ресурсов, если вы хотите узнать больше.

Свойство ViewData по-прежнему доступно, и вы можете использовать оба взаимозаменяемо. Оба они используют одно и то же резервное хранилище, поэтому изменения, сделанные одним способом, будут доступны другим способом.

Преимущество использования View заключается в более лаконичном синтаксисе. Недостатком является то, что вы не получаете поддержку IntelliSense.

Причина, по которой вы можете установить View.Title на своей странице просмотра, и правильное значение отображается на странице макета, связана с порядком рендеринга страниц Razor. Мы называем это рендерингом наизнанку, что означает, что ваша страница просмотра выполняется первой, ее выходные данные HTML собираются в буфер, затем выполняется страница макета, а вывод буферизованной страницы просмотра вводится там, где вы вызываете RenderBody.

person marcind    schedule 10.11.2010
comment
В этом есть смысл. Я предполагаю, что меня тоже путают с TempData и ViewData.Model - насколько я понимаю, ViewData.Model позволяет вам динамически устанавливать модель, отображаемую в представлении, вместо того, чтобы возвращать View (модель). Это правильно? Спасибо за ваш ответ. :) - person RPM1984; 10.11.2010