Инкапсуляция пользовательских элементов управления в ASP.NET MVC

Извините, если это базовый вопрос - у меня возникли проблемы с мысленным переходом на ASP.NET MVC из фреймворка страницы.

В структуре страницы я часто использую файлы ASCX для создания небольших инкапсулированных фрагментов функциональности, которые размещаются в различных местах на сайте. Если я создаю страницу и мне нужен один из этих элементов управления - я просто добавляю ссылку, и все работает.

Насколько я могу судить, в MVC файл ASCX - это всего лишь частичное представление. Означает ли это, что где бы я ни хотел добавить одну из этих функциональных единиц, я также должен добавить некоторый код в метод действия контроллера, чтобы убедиться, что соответствующие ViewData доступны для ASCX?

Если это так, мне кажется, что это шаг назад. Это означает, например, что я не мог просто «перетащить» элемент управления на главную страницу, не добавляя код для каждого контроллера, представления которого используют эту главную страницу!

Я подозреваю, что мне что-то не хватает - любая помощь будет принята с благодарностью.

Спасибо, - Крис


person Chris Roberts    schedule 07.11.2009    source источник
comment
не извиняйтесь, потому что это неправда, что все читатели, которые читают этот блог, являются экспертами в asp.net или mvc   -  person    schedule 07.11.2009
comment
+1 для грамматики вашего вопроса. Вы редактируете мой вопрос, затем переходите в мой профиль, затем редактируете мой вопрос, потому что у меня нет хороших знаний по английскому языку   -  person    schedule 07.11.2009


Ответы (3)


Насколько я могу судить, в MVC файл ASCX - это всего лишь частичное представление. Означает ли это, что где бы я ни хотел добавить одну из этих функциональных единиц, я также должен добавить некоторый код в метод действия контроллера, чтобы убедиться, что соответствующие ViewData доступны для ASCX?

да.

Однако вы можете использовать RenderAction в вашем представлении вместо RenderPartial, и все ваши функции (включая данные, передаваемые во вспомогательное представление) будут инкапсулированы.

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

person Robert Harvey    schedule 07.11.2009
comment
Отлично! RenderAction - это та часть головоломки, которую я упустил! Огромное спасибо! - person Chris Roberts; 07.11.2009
comment
Также ознакомьтесь с этим сообщением blog.codeville. net / 2008/10/14 / partial-requests-in-aspnet-mvc для некоторых других альтернатив. - person joshperry; 07.11.2009
comment
Вот лучший обзор RenderAction: blogs.intesoft .net / post / 2009/02 / - person Ryan Emerle; 07.11.2009

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

Вы видели, как маскируются «элементы управления» в ASP.NET MVC? Это методы HtmlHelper. Если вы хотите, чтобы текстовое поле было привязано, например, к «FirstName», вы можете:

<%= Html.Textbox("FirstName") %>

И у вас есть такие вещи для многих стандартных элементов управления.

Что вы можете сделать, так это создать свои собственные подобные методы. Чтобы создать свой собственный метод, вы должны создать метод расширения в классе HtmlHelper, например:

public static class HtmlHelperExtensions
{
    public static string Bold(this HtmlHelper html, string text)
    {
        return "<b>" + text + "</b>\n";
    }
}

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

<%= Html.Bold("This text will be in bold-face!") %>

Что ж, это не особо полезно. Но можно делать очень интересные вещи. Я довольно часто использую метод, который берет перечисление и создает раскрывающийся список со значениями из этого перечисления (например: enum Gender { Male, Female }, а в представлении что-то вроде Gender: <%= Html.EnumDropDown(Model.Gender) %>).

Удачи!

person Bruno Reis    schedule 07.11.2009

Вы можете визуализировать частичный вид и передать объект модели в.

<% Html.RenderPartial("MyPartial", ViewData["SomeObject"]);

Затем в файле частичного представления (.ascx) вы можете использовать объект «Модель» (при условии, что вы унаследовали правильный объект в своем замедлении @ Control), чтобы делать с этим объектом все, что вам нужно.

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

В главном представлении (файл .aspx) вам нужно будет определить правильный объект в ViewData, который вы передаете частичному представлению.

Другой способ, который вы можете сделать, - это использовать:

<% Html.RenderAction("MyAction", "MyController", new { Parameter1="Value1"}) %>

Предыдущий метод вызывает действие контроллера, принимает его ответ и помещает его туда, где вы вызвали метод «RenderAction ()». Это эквивалент выполнения запроса к действию контроллера и чтения ответа, за исключением того, что вы помещаете ответ в другой файл.

Google "renderaction and renderpartial" для получения дополнительной информации.

person Omar    schedule 07.11.2009
comment
Отлично! RenderAction - это та часть головоломки, которую я упустил! Огромное спасибо! - person Chris Roberts; 07.11.2009