Как я могу получить доступ к элементу управления на стороне сервера в коде позади моего проекта MVC? - PullRequest
5 голосов
/ 19 июня 2009

Прежде всего, позвольте мне заявить, что я знаю, что доступ к серверным элементам управления в моем представлении не одобряется в MVC. Тем не менее, мне нужно в моей ситуации (насколько я вижу). Вот моя история. :)

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

Мой первоначальный подход состоял в том, чтобы иметь два веб-сайта (сайт WebForms и сайт MVC), а затем связать их с помощью iFrames со стороны MVC. Хотя я знаю, что это сработало бы, было бы немного излишним просто использовать этот конкретный элемент управления. Проведя дополнительные исследования, я обнаружил , что я могу "смешивать мальчиков" и использовать архитектуру WebForms внутри проекта MVC. Поэтому новый подход, который я выбрал, состоит в том, чтобы только копировать страницы, использующие этот сторонний элемент управления, в определенный каталог (т. Е. 'View \ SomeDir \ WebForms'), а затем игнорировать этот каталог в мой файл global.asax, чтобы система маршрутизации MVC не подхватила его:

routes.IgnoreRoute("View\SomeDir\WebForms\{*pathInfo}");

К сожалению, когда я скопировал страницу ASPX в свой проект MVC, я обнаружил, что CodeBehind не предоставляет мне доступ к моему элементу управления на странице. Вот как это устроено:

<%@ Register 
  Assembly="..." 
  Namespace="..." 
  TagPrefix="custom" %>

<custom:SomeControl ID="customControl" runat="server" />

Вот как выглядит мой код:

public class MyPage : Page
{
  protected void Page_Load(object sender, EventArgs args)
  {
     Debug.WriteLine(customControl.ID); // <-- COMPILE ERROR: Cannot resolve symbol 'customControl'
  }
}

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

Возможно ли то, что я пытаюсь сделать? Другой подход, который я подумал об этой работе might, - инициализация и перехват событий на стороне сервера в классе контроллера. Тем не менее, я хотел бы избежать сериализации состояния элемента управления в представлении, просто передать его контроллеру и, если возможно, обратно?

Заранее спасибо за любой совет!

Ответы [ 2 ]

5 голосов
/ 19 июня 2009

Святое дерьмо! Я нашел решение через 10 минут после того, как отправил это.

Исправление состояло в том, чтобы щелкнуть правой кнопкой мыши мой проект и сказать «Преобразовать в веб-приложение» и изменить мой класс CodeBehind обратно на «частичный». Все мои элементы управления теперь доступны через код.

Спасибо за чтение, и я надеюсь, что мой вопрос / ответ однажды поможет кому-то еще. :)

0 голосов
/ 19 июня 2009

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

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

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

...