如何在我的MVC项目中访问代码隐藏中的服务器端控件?

Luc*_*Luc 5 asp.net-mvc code-behind asp.net-mvc-routing

首先,我要说明我知道在我的视图中访问服务器端控件在MVC中是不受欢迎的.但是,我需要在我的情况下(据我所知).这是我的故事.:)

我有一个第三方控件,我在我的Web应用程序中使用.我目前被赋予了将WebForms解决方案移植到MVC的任务.这个特定的第三方Web控件需要WebForms体系结构,因此我希望只使用WebForms项目中的相同代码.

最初的方法是拥有两个网站(一个WebForms网站和一个MVC网站),然后使用来自MVC端的iFrame链接这两个网站.虽然我知道这会起作用,但使用这个特殊控件只是有点过分.经过更多的研究,我发现我可以"混合男孩们"并在MVC项目中使用WebForms架构.因此,我采用的新方法是将使用此第三方控件的页面复制到特定目录(即'View\SomeDir\WebForms'),然后忽略我的global.asax文件中的该目录,以便MVC路由系统没有拿起它:

routes.IgnoreRoute("View\SomeDir\WebForms\{*pathInfo}");
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我将ASPX页面复制到我的MVC项目时,我发现CodeBehind不允许我访问我在页面上的控件.以下是设置方式:

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

<custom:SomeControl ID="customControl" runat="server" />
Run Code Online (Sandbox Code Playgroud)

这是我的代码背后的样子:

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

不幸的是我的项目甚至不会编译,因为我在CodeBehind的每个控件上都出现了这个错误.将其他控件(即标签,面板,文本框等)转换为客户端标签不是问题,但我需要在我的代码中访问此自定义控件,以便我可以收听它(服务器端) )事件并作出相应的反应; 基本的WebForms东西......

我正在努力做甚么可能吗?我想到的另一种方法might是初始化并捕获控制器类中的服务器端事件.但是,我想避免在视图中序列化控件的状态,只是将其传递给控制器​​并尽可能返回?

提前感谢任何建议!

Luc*_*Luc 5

哇靠!!我发布此消息后10分钟,我找到了解决方案.

修复是右键单击我的项目并说"转换为Web应用程序"并将我的CodeBehind类更改回"部分".现在可以通过后面的代码访问我的所有控件.

感谢阅读,我希望我的问题/答案有一天会帮助别人.:)