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

我有一个在我的网络应用程序中使用的第三方控件。我目前的任务是将我们的 WebForms 解决方案移植到 MVC。这个特定的第三方 Web 控件需要 WebForms 架构,因此我希望仅使用我的 WebForms 项目中的相同代码。

我的 初步接近 是拥有两个网站(一个 WebForms 网站和一个 MVC 网站),然后从 MVC 端使用 iFrame 链接这两个网站。虽然我知道这会起作用,但仅仅使用这个特定的控件就有点过分了。经过更多研究后,我 发现 我可以“混合这些男孩”并在 MVC 项目中使用 WebForms 架构。因此,我采取的新方法是 仅有的 将使用此第三方控件的页面复制到特定目录(即'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 工作是初始化并捕获控制器类中的服务器端事件。但是,我想避免序列化视图中控件的状态,只是将其传递给控制器​​并返回(如果可能的话)?

预先感谢您的任何建议!

有帮助吗?

解决方案

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

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

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

其他提示

我不认为将某些内容移植到 MVC 只是为了将其中一半保留在传统 WebForm 中有什么意义。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top