我正在尝试实现一个使用WebForm ascx用户控件(非MVC)的MVC Razor _Layout.cshtml页面。我根据Scott Hansleman的文章“使用ASP.NET MVC 3混合Razor视图和WebForms母版页”http://www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspx
的“是”部分进行此操作文章说明如何在webform Site.Master页面以及MVC Razor _Layout页面中使用相同的ascx用户控件。
从我读过elsewhere on Stackoverflow开始,可以在MVC页面中使用传统的ascx用户控件(以及ASP.NET webform服务器控件)。使用以下行应该在我的Razor _Layout中呈现ascx用户控件:
@{ Html.RenderPartial("~/UserControls/WebUserControl1.ascx"); }
然而,这会引发错误:
The view at '~/UserControls/WebUserControl1.ascx' must derive from ViewPage,
ViewPage<TModel>, ViewUserControl, or ViewUserControl<TModel>.
我也尝试了以下类似的结果:
@Html.Partial("~/UserControls/WebUserControl1.ascx")
我在这里缺少什么?
答案 0 :(得分:16)
如错误消息所述,用户控件“必须从...... ViewUserControl
派生”。在用户控件的代码隐藏文件中,只需更改此...
public partial class WebUserControl1 : UserControl
{
// ...
}
......对此:
public partial class WebUserControl1 : ViewUserControl
{
// ...
}
ViewUserControl
继承自UserControl
,因此它将继续在您现有的WebForms页面中运行。
您可能必须处理此问题之外的其他问题,以便让您的用户控制在MVC中工作。我遇到的至少另一个是(SLaks提到):
'controlType'类型的控件'controlId'必须放在带有runat = server的表单标记内。
如果遇到这样的事情,你就必须要有创意。修改用户控件,以便它可以在WebForms和MVC中幸福地生活(用通用的HTML等价替换有问题的控件 - 具有所有含义),或者复制它以便拥有WebForms版本和MVC版本。
例如,您必须将<asp:TextBox ID="search">
替换为<input type="text" name="search" />
,这意味着您还需要修改处理来自该输入的值的服务器端代码。基本上你必须中断用户控件,将它从过去用于体现视图渲染逻辑和后置处理逻辑的东西转换为只呈现视图的东西。
可以使一个ascx
控件可以很好地与WebForms和Razor MVC一起使用,对于简单的事情,例如页眉和页脚或数据的只读视图,这是一个很好的方法用于将应用程序迁移到MVC。但是对于输入表单等更复杂的东西,维护ascx
用户控件和MVC Razor视图可能会更容易。
答案 1 :(得分:9)
您可以通过以下方式在MVC中使用asp.net用户控件
第一次更改用户控件继承,默认为
默认:
public partial class TestControl: UserControl
{
// ...
}
变化:
public partial class TestControl: ViewUserControl
{
// ...
}`
第二个用户控件使用asp.net控件,如表格标签和脚本管理器中的这个控件应该调用
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestControl.ascx.cs" Inherits="TestApp.UserControls.TestControl" %>
<div>
<h1>Welcome Test User Control</h1>
<form id="test" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:TextBox runat="server" ID="txtbxTest" Text="Hello">
</asp:TextBox>
</form>
</div>
第3次调用MVC视图中的用户控件
@{ Html.RenderPartial("~/UserControls/TestControl.ascx"); }
它应该没有任何问题,将旧的asp.net网站转换为MVC将是有益的,如果旧网站具有用户控件,则可以使用MVC中的新技术轻松升级。
答案 2 :(得分:3)
您不能在ASP.Net MVC中使用经典的ASP.Net用户控件(带回发和ViewState)。
Html.Partial
仅允许您呈现部分视图,这些视图恰好使用相同的扩展名,但不一样。