首先让我声明,我知道在我的视图中访问服务器端控件在 MVC 中是不受欢迎的。但是,我需要在我的情况下(据我所知)。这是我的故事。:)
我在我的 Web 应用程序中使用了第 3 方控件。我目前的任务是将我们的 WebForms 解决方案移植到 MVC。这个特定的第三方 Web 控件需要 WebForms 架构,所以我希望只使用我的 WebForms 项目中的相同代码。
我最初的方法是创建两个网站(一个 WebForms 站点和一个 MVC 站点),然后使用 MVC 端的 iFrame 将这两个站点链接起来。虽然我知道这会起作用,但仅仅使用这个特定的控件有点过头了。在做了更多研究之后,我发现我可以“混合男孩”并在 MVC 项目中使用 WebForms 架构。因此,我采用的新方法是仅将使用此 3rd 方控件的页面复制到特定目录(即“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
是在控制器类中初始化和捕获服务器端事件。但是,我想避免在视图中序列化控件的状态,只是将其传递给控制器并在可能的情况下返回?
提前感谢您的任何建议!