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

时间:2009-06-18 20:22:17

标签: asp.net-mvc asp.net-mvc-routing code-behind

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

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

我的initial approach有两个网站(一个WebForms网站和一个MVC网站),然后使用来自MVC端的iFrame链接这两个网站。虽然我知道这会起作用,但使用这个特殊的控件只是有点过分。经过更多的研究,我discovered我可以“混合男孩们”并在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工作的另一种方法是初始化和捕获控制器类中的服务器端事件。但是,我想避免在视图中序列化控件的状态,只是将其传递给控制器​​并在可能的情况下返回?

提前感谢任何建议!

2 个答案:

答案 0 :(得分:5)

神圣的废话!我发布此消息后10分钟,我找到了解决方案。

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

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

答案 1 :(得分:0)

我没有看到将一些内容移植到MVC只是为了将其中的一半保留在传统的WebForms中。

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

我会选择其中一种,尽量避免将两者混合在一起。