ASP.NET MVC 2 - когда использовать шаблоны и когда использовать частичные представления

Одной из новых функций в ASP.NET MVC 2 Preview 1 является поддержка концепции шаблонов редактора и шаблонов отображения, которые позволяют предварительно определить, как данный объект будет отображаться для отображения или редактирования с помощью простого вызова вспомогательной функции HTML:

<%=Html.EditorFor(customer => customer) %>
<%=Html.DisplayFor(customer => customer) %>

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

Зачем использовать шаблон вместо частичного просмотра или наоборот? Кроме того, при использовании шаблона редактора, каков идеальный способ добавить клиентскую логику в редактор, не копируя ее в каждое представление, использующее этот редактор?


person Nathan Taylor    schedule 20.08.2009    source источник


Ответы (2)


ScottGu частично объясняет это в своем сообщение в блоге о MVC V2.

Насколько я понимаю, это создаст входные данные для каждого свойства объекта, который вы передаете помощнику. Итак, если у вас есть объект:

public class Customer
{
    public string Name { get; set; }
    [UIHint("MyCoolCalendar")]
    public DateTime CoolDate { get; set; }
}

А затем создайте редактор:

<%= Html.EditorFor(customer => customer) %>

Он будет создавать текстовый ввод для имени клиента и MyCoolCalendar (который является настраиваемым элементом управления) для CoolDate без необходимости писать настраиваемый элемент управления для обертывания всего объекта. Он автоматически выводит тип элемента управления из типа / uihint свойства. По крайней мере, это так, как я понял, еще не имея времени проверить это.

person Runeborg    schedule 20.08.2009
comment
Я прочитал сообщение г-на Гу, и в нем объясняется, что EditorFor можно использовать как для отдельных полей, так и для целых объектов. Я имею в виду последний случай в моем сценарии выше. - person Nathan Taylor; 21.08.2009
comment
Ох, ладно. Он также указывает цель этого в сообщении: по умолчанию он будет перебирать общедоступные свойства объекта и генерировать элемент ‹label›, ‹input /› и любое соответствующее сообщение проверки для каждого найденного свойства .. Итак. он автоматически генерирует ввод для всех свойств объекта. На объекте вы можете установить UIHints в свойствах, чтобы использовать настраиваемые элементы управления для определенных свойств. Я немного обновлю свой ответ. - person Runeborg; 21.08.2009
comment
Это значит, что мне не нужно явно определять шаблон при вызове EditorFor (SomeObject), если мне не нужно делать ничего особенного, например, обрабатывать настраиваемые поля? - person Nathan Taylor; 21.08.2009
comment
Да, насколько я понимаю, он будет рекурсивно (?) Анализировать свойства и добавлять нужные редакторы в зависимости от типов свойств. - person Runeborg; 21.08.2009
comment
Это все еще не дает ответа на вопрос, как добавить клиентскую логику в редактор, не копируя ее в каждое представление, использующее этот редактор ... - person fretje; 11.03.2011
comment
Что ж, лучший способ, который я нашел для решения этой проблемы, - это использовать диспетчер сценариев, чтобы поместить сценарий в элемент управления stackoverflow.com/questions/320333/scriptmanager-asp-net-mvc. Он гарантирует, что сценарий будет включен только один раз, поэтому вы можете безопасно использовать элемент управления, не беспокоясь о том, какие сценарии вам нужно включить для его работы. - person Runeborg; 24.03.2011

Вот один пример, который, как мне показалось, хорошо работает.

Допустим, у вас есть клиент с адресом. Вы не можете создать адрес для НОВОГО клиента, но с помощью ассоциации вы можете получить объект «Клиент» с полем «Адрес».

Затем в вашем методе «Create» для Customer вы вызываете Html.EditorFor(c => c.Address); (и здесь вы можете создать собственный шаблон для своих нужд), который создаст полностью заполненный объект Address, который вы можете сохранить перед Customer, тем самым разрешив зависимость.

Теперь, когда у вас есть справочные данные, такие как список стран или штатов, или что-то еще, может быть лучше просто использовать частичное представление для его визуализации и не беспокоиться об ассоциации.

Надеюсь это поможет,

-влад

person Vladimir Zelenko    schedule 08.02.2010