MVC: Как инкапсулировать логику в частичном представлении MVC ascx с той же эффективностью контроля веб-форм, что и в ascx? - PullRequest
5 голосов
/ 11 августа 2010

Мне нужно создать несколько частичных представлений ascx в моих MVC-приложениях для инкапсуляции многократно используемых функций, а также архивирования SOR и SOC.Однако я столкнулся с проблемой, как инкапсулировать бизнес-логику, которая управляет представлениями MVC ascx.

В веб-формах код элемента управления ASCX может обрабатывать событие нажатия кнопки, и браузер по-прежнему показывает ту же страницу только с одной обратной передачей.Как я могу архивировать то же самое в MVC?Когда ~ / Address / Edit / 2 включает частичное представление ascx с кнопкой на нем, которая вызывает другое действие MVC - скажем, ~ / ShareController / CommonAction - каков наилучший способ для CommonAction вернуться к тому же представлению, которое включает в себяфайл ascx?

Возможно, я упускаю общий шаблон в веб-разработке MVC?

Спасибо,

Макс

Обновление: вот более подробное описаниешаблон, который я ищу:

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

Редактор адресов будет сидеть на многих страницах с различными контроллерами / действиями.

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

Обновление 2:

Не уверен, что это имеет какое-либо отношение к полноте состояния веб-формы.Совершенно другая особенность.Речь идет о вызове контроллера другим субконтроллером (или дочерним контроллером) для обработки частичного представления.См. Мой пример в конце этого комментария.

Я просто хочу достичь того же уровня инкапсуляции и разделения интересов.Если у MVC-фреймворка этого нет, это серьезный недостаток.

В MVC, как мы можем иметь «вещь» (или частичное представление из-за отсутствия лучшей альтернативы), которая способна обрабатывать презентацию, а также логику и находиться на другой родительской странице без какого-либо вмешательства?

Насколько я понимаю, частичные представления в MVC - это просто презентация, которая не может иметь выделенный контроллер без вмешательства в основной контроллер.Надеюсь, я ошибся

Чтобы привести еще один пример, рассмотрим эту страницу, которую вы читаете «stackoverflow.com/questions/ enjid}».Включает компонент «Добавить комментарий».Добавление комментария может выполнять проверку на стороне сервера для предотвращения неправильных комментариев.Как вы могли бы создать сквозной компонент «Добавить комментарий», который может находиться на любой странице и обрабатывать необходимую логику контроллера?Единственный способ, о котором я могу подумать, - это изменить контроллер страницы хоста, чтобы он мог выдавать сообщения проверки пользователя и просить их исправить ошибки с помощью обратной отправки.Это означает, что вы добавляете компонент на 10 разных страниц, вам нужно изменить 10 разных контроллеров.Это убивает «СУХОГО»

Я НАДЕЖДА, ЧТО Я НЕПРАВИЛЬНОпотому что я люблю MVC sofar.

Вывод:

Я отметил ответ Кенни как ответ;однако я бы посчитал это серьезным недостатком инфраструктуры MVC с точки зрения инкапсуляции, повторного использования и принципа DRY.

Мое мнение не имеет никакого отношения к полноте состояния веб-форм.

Пожалуйста, позвольте мне объяснить:

В веб-формах вы можете на 100% инкапсулировать сложные функции в элементе управления ascx.и, конечно же, связанные библиотеки классов.Один (1) разработчик может потратить недели на его разработку.Как только его работа закончена, никому не нужно ничего знать об этом и просто использовать это.Пользовательский элемент управления можно многократно использовать на многих страницах, не беспокоя других «разработчиков» подробными действиями, выполняемыми в компоненте ascx.

В отличие от этого, вы никогда не сможетедобиться того же с ASP.NET MVC, где частичке ascx необходимо взаимодействовать с пользователем.Как только ascx должен взаимодействовать, ему нужен собственный контроллер, и контроллер должен сохранить ModelState.

Джереми Скиннер представил [ModelStateToTempData] в MVCContrib: http://www.jeremyskinner.co.uk/2008/10/18/storing-modelstate-in-tempdata-with-aspnet-mvc/ Однако это всего лишь патч.

Хороший фреймворк должен позволить разработчику на 100% инкапсулировать свою работу - вконтроль, частичный, ascx или что-то еще - и он был у остальной команды, чтобы они могли «просто использовать его», не зная никаких данных.Winform отлично справляется с этим во многих сложных сценариях.

Любой, хотя добро пожаловать.

Ответы [ 4 ]

0 голосов
/ 07 апреля 2011

Я ищу то же самое, и я наткнулся на Html.Action и .RenderAction, которые, кажется, выполняют контроллер на сервере и возвращают / вводят вывод.

Это можно использовать для инкапсуляции и повторного использования в MVC, но я пока не пробую.

0 голосов
/ 11 августа 2010

Я не знаю, доведу ли я вашу проблему до 100%, но не могу просто предоставить UserControl необходимые вам данные?

Передать <% = Url.Action ()%>, что отправка отправляетсячтобы при нажатии на.Если вы затем хотите, чтобы страница перенаправлялась обратно на ту же страницу, на которой вы находились, вы можете перенаправить и повторно сохранить свой ModelState (http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx tip # 13).Перенаправление может быть выполнено по рефереру или путем отправки действия и имени контроллера в ваш метод действия.

Если это не сработает, вы всегда можете использовать Ajax?

0 голосов
/ 12 августа 2010

Я думаю, что правильный способ справиться с этим типом функциональности в MVC (и практически всем, что не является веб-формами) - это вызов ajax.

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

0 голосов
/ 11 августа 2010

Я почти уверен, что это "не так" должно быть сделано, но я обычно смотрю на URL реферера и перенаправляю туда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...