在MVC Razor视图中使用旧版ASP.NET ASCX用户控件

Wal*_*ter 16 asp.net-mvc webforms ascx

我正在尝试实现一个使用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用户控件.

从我在Stackoverflow上的其他地方读到的内容,可以在MVC页面中使用传统的ascx用户控件(以及ASP.NET webform服务器控件).使用以下行应该在我的Razor _Layout中呈现ascx用户控件:

@{ Html.RenderPartial("~/UserControls/WebUserControl1.ascx"); }
Run Code Online (Sandbox Code Playgroud)

但是,这会引发错误:

The view at '~/UserControls/WebUserControl1.ascx' must derive from ViewPage,
ViewPage<TModel>, ViewUserControl, or ViewUserControl<TModel>.
Run Code Online (Sandbox Code Playgroud)

我也试过以下类似的结果:

@Html.Partial("~/UserControls/WebUserControl1.ascx")
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

Dan*_*ing 17

如错误消息所述,用户控件"必须从...派生ViewUserControl".在用户控件的代码隐藏文件中,只需更改此...

public partial class WebUserControl1 : UserControl
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

......对此:

public partial class WebUserControl1 : ViewUserControl
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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视图可能会更容易.


adn*_*nan 9

您可以通过以下方式在MVC中使用asp.net用户控件

默认情况下,第一次更改用户控件继承

默认:

public partial class TestControl: UserControl
{
// ...
}
Run Code Online (Sandbox Code Playgroud)

更改:

public partial class TestControl: ViewUserControl
{
// ...
}`
Run Code Online (Sandbox Code Playgroud)

使用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>
Run Code Online (Sandbox Code Playgroud)

第3次调用MVC View中的用户控件

@{ Html.RenderPartial("~/UserControls/TestControl.ascx"); }
Run Code Online (Sandbox Code Playgroud)

它应该没有任何问题,将旧的asp.net网站转换为MVC将是有益的,如果旧网站有用户控件,它很容易用MVC中的新技术升级.


SLa*_*aks 3

您不能在 ASP.Net MVC 中使用经典的 ASP.Net 用户控件(带回发和 ViewState)。

Html.Partial只允许您渲染部分视图,这些视图碰巧使用相同的扩展名,但并不相同。

  • @BobTodd:通过“经典的 ASP.Net 用户控件”,我的意思是回发和 ViewState,这是行不通的。 (4认同)
  • 有点误导,只要您更新 UX 以继承 ViewUserControl 就可以了... http://stackoverflow.com/questions/6538869/mvc3-razor-is-it-possible-to-render-a-legacy-ascx (3认同)