2011-10-28 152 views
13

我想实现一个使用WebForm ascx用户控件(非MVC)的MVC Razor _Layout.cshtml页面。我这样做是基于这个Scott Hansleman文章“Mixing Razor Views and WebForms Master Pages with ASP.NET MVC 3”中的“Yes”部分。http://www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspx在MVC Razor视图中使用传统的ASP.NET ASCX用户控件

这篇文章说明如何在两个a中使用相同的ascx用户控件webform Site.Master页面以及MVC Razor _Layout页面。

从我读的elsewhere on Stackoverflow可以在MVC页面中使用传统的ascx用户控件(以及ASP.NET webform服务器控件)。使用下面的线应该呈现在我的剃刀_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") 

我在这里错过了什么?

回答

3

您不能在ASP.Net MVC中使用传统的ASP.Net usercontrols(w/postbacks和ViewState)。

Html.Partial只允许您渲染部分视图,它恰好使用相同的扩展名,但不相同。

+3

有点误导,只要你更新UX继承ViewUserControl你没事吧... http://stackoverflow.com/questions/6538869/mvc3-razor-is-it-possible-to-render-a-传统-ascx –

+4

@BobTodd:“传统的ASP.Net用户控件”,我的意思是回传和ViewState,这将无法正常工作。 – SLaks

15

如错误消息所述,用户控件“必须从...... ViewUserControl派生”。从UserControl

public partial class WebUserControl1 : ViewUserControl 
{ 
    // ... 
} 

ViewUserControl继承,因此它会继续在现有的工作:在隐藏文件的用户控件的代码,只是改变了...

public partial class WebUserControl1 : UserControl 
{ 
    // ... 
} 

...这个WebForms页面。

不过,为了让您的用户控件在MVC中工作,您可能需要处理超出此范围的其他问题。至少一个其他我遇到的是(通过SLaks提到):

Control 'controlId' of type 'controlType' must be placed inside a form tag with runat=server.

如果你遇到这样的东西,你将不得不发挥创造性。要么修改用户控件,以便它可以在WebForms和MVC中愉快地生活(用通用HTML等效替换违规控件 - 具有所有这些含义),或者复制它,以便您拥有WebForms版本和MVC版本。

例如,您将不得不将<asp:TextBox ID="search">替换为<input type="text" name="search" />,这意味着您还需要修改处理来自该输入的值的服务器端代码。基本上,你必须将用户控件中性化,将其从用于体现视图渲染逻辑后处理逻辑的东西转换成只呈现视图的东西。

可以使一个ascx控制既WebForms和MVC剃刀很好的发挥,像页眉和页脚或只读视图数据的简单的事情,这是迁移应用程序MVC一个不错的办法。但对于输入表单等更复杂的事情,维护用户控件和MVC Razor视图可能会更容易。

8

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

第一变化的用户控件继承这个作为

默认:

public partial class TestControl: UserControl 
{ 
// ... 
} 

变化:

public partial class TestControl: ViewUserControl 
{ 
// ... 
}` 

第二个用户控件使用asp.net控件,像这样在form标签和scr中IPT经理应该在MVC查看通话

<%@ 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> 

第三个呼叫的用户控件作为

@{ Html.RenderPartial("~/UserControls/TestControl.ascx"); } 

它应该没有任何问题,这将有利于老asp.net网站转换成MVC,如果旧网站拥有用户控件,使用MVC中的新技术很容易升级。

+0

这是使用MVC的asp.net userconrol时的最佳解决方案。 –

相关问题