Как я могу получить доступ к серверному элементу управления в коде моего проекта MVC?
-
06-07-2019 - |
Вопрос
Прежде всего, позвольте мне заявить, что я знаю, что доступ к серверным элементам управления в моем представлении не одобряется в 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 ...
Возможно ли то, что я пытаюсь сделать? Другой подход, который я подумал о том, что может
работать, - это инициализация и перехват событий на стороне сервера в классе контроллера. Тем не менее, я бы хотел избежать сериализации состояния элемента управления в представлении, просто передать его контроллеру и, если возможно, обратно?
Заранее спасибо за любой совет! Р>
Решение
Святое дерьмо! Я нашел решение через 10 минут после того, как отправил это. Р>
Исправление заключалось в том, чтобы щелкнуть правой кнопкой мыши по моему проекту и сказать «Преобразовать в веб-приложение». и изменить мой класс CodeBehind обратно на «частичный». Все мои элементы управления теперь доступны через код.
Спасибо за чтение, и я надеюсь, что мой вопрос / ответ однажды поможет кому-то еще. :) Р>
Другие советы
Я не вижу смысла переносить что-либо в MVC просто для того, чтобы сохранить половину этого в традиционных WebForms.
Этот подход будет означать, что любые будущие разработчики должны быть знакомы с обеими технологиями и, на мой взгляд, не являются чистыми.
Я хотел бы пойти с одним или другим и попытаться избежать смешивания двух.