Как я могу получить доступ к серверному элементу управления в коде моего проекта MVC?

StackOverflow https://stackoverflow.com/questions/1014987

Вопрос

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top