首先,请允许我声明我知道在我的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
工作的另一种方法是初始化和捕获控制器类中的服务器端事件。但是,我想避免在视图中序列化控件的状态,只是将其传递给控制器并在可能的情况下返回?
提前感谢任何建议!
答案 0 :(得分:5)
神圣的废话!我发布此消息后10分钟,我找到了解决方案。
修复是右键单击我的项目并说“转换为Web应用程序”并将我的CodeBehind类更改回“部分”。现在可以通过后面的代码访问我的所有控件。
感谢阅读,我希望我的问题/答案有一天会帮助别人。 :)
答案 1 :(得分:0)
我没有看到将一些内容移植到MVC只是为了将其中的一半保留在传统的WebForms中。
这种方法意味着任何未来的开发人员都需要熟悉这两种技术,并且在我看来并不干净。
我会选择其中一种,尽量避免将两者混合在一起。