5

首先让我声明,我知道在我的视图中访问服务器端控件在 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是在控制器类中初始化和捕获服务器端事件。但是,我想避免在视图中序列化控件的状态,只是将其传递给控制器​​并在可能的情况下返回?

提前感谢您的任何建议!

4

2 回答 2

5

碉堡了!!我在发布此内容 10 分钟后找到了解决方案。

解决方法是右键单击我的项目并说“转换为 Web 应用程序”并将我的 CodeBehind 类更改回“部分”。我的所有控件现在都可以通过后面的代码访问。

感谢您的阅读,我希望我的问题/答案有一天会对其他人有所帮助。:)

于 2009-06-18T20:41:37.410 回答
0

我不认为将某些东西移植到 MVC 只是为了将其中的一半保留在传统的 WebForms 中。

这种方法意味着任何未来的开发人员都需要熟悉这两种技术,并且在我看来并不干净。

我会选择其中一个,并尽量避免将两者混合。

于 2009-06-18T20:43:35.800 回答