Прежде всего, позвольте мне заявить, что я знаю, что доступ к серверным элементам управления в моем представлении не одобряется в 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
, - инициализация и перехват событий на стороне сервера в классе контроллера. Тем не менее, я хотел бы избежать сериализации состояния элемента управления в представлении, просто передать его контроллеру и, если возможно, обратно?
Заранее спасибо за любой совет!