2011-10-28 33 views
13

Estoy intentando implementar una página MVC Razor _Layout.cshtml que utiliza un control de usuario ascx de WebForm (no MVC). Estoy haciendo esto basada en el valor "Sí" de este artículo de Scott Hansleman "Mezcla de afeitar Vistas y formularios Web páginas maestras con ASP.NET MVC 3" http://www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspxUsar un control de usuario ASP.NET ASCX heredado en MVC Razor vista

El artículo dice cómo utilizar el mismo control de usuario ascx tanto en una webform Site.Master page así como también una página MVC Razor _Layout.

Por lo que he leído elsewhere on Stackoverflow es posible utilizar los controles de usuario ascx heredados (así como los controles de servidor de formulario web ASP.NET) en páginas MVC. Utilizando la siguiente línea debe representar el control ascx usuario en mi maquinilla de afeitar _Layout:

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

Sin embargo, que lanza el error:

The view at '~/UserControls/WebUserControl1.ascx' must derive from ViewPage, 
ViewPage<TModel>, ViewUserControl, or ViewUserControl<TModel>. 

También he intentado el siguiente con resultados similares:

@Html.Partial("~/UserControls/WebUserControl1.ascx") 

¿Qué me falta aquí?

Respuesta

3

No puede usar los controles de usuario ASP.Net clásicos (w/postbacks y ViewState) en ASP.Net MVC.

Html.Partial solo le permite representar vistas parciales, que utilizan la misma extensión, pero no son lo mismo.

+3

ligeramente engañoso, siempre y cuando actualice el UX para heredar ViewUserControl está bien ... http: //stackoverflow.com/questions/6538869/mvc3-razor-is-it-possible-to-render-a- legacy-ascx –

+4

@BobTodd: por "controles de usuario clásicos de ASP.Net", quiero decir postbacks y ViewState, que no funcionarán. – SLaks

15

Como indica el mensaje de error, el control de usuario "debe derivarse de ... ViewUserControl". En el archivo de código subyacente para el control de usuario, sólo tiene que cambiar esto ...

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

... a esto:

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

ViewUserControl hereda de UserControl, por lo que seguirá trabajando en su actual Páginas de WebForms.

Puede que tenga que lidiar con problemas adicionales más allá de este para que su control de usuario funcione en MVC. Al menos otro que he encontrado es (aludido por SLaks):

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

Si se encuentra con este tipo de cosas, vas a tener que ser creativo. Modifique el control de usuario para que pueda vivir feliz tanto en WebForms como en MVC (reemplace los controles ofensivos con equivalentes HTML genéricos, con todas las implicaciones de eso), o duplíquelo para que tenga una versión de WebForms y una versión de MVC.

Por ejemplo, tendrá que reemplazar cosas como <asp:TextBox ID="search"> con <input type="text" name="search" />, lo que significa que también necesita modificar el código del lado del servidor que maneja el valor que proviene de esa entrada. Básicamente, debe neutralizar el control de usuario, convirtiéndolo de algo que solía encarnar la lógica de representación de visualización y lógica de gestión de posterioridad, en algo que solo representa una vista.

Usted puede hacer uno ascx juego de control muy bien con ambas WebForms y MVC Razor, y por cosas tan simples como los encabezados y pies de página o vistas de sólo lectura de datos Este es un buen enfoque para la migración de una aplicación de MVC.Pero para cosas más complejas como formularios de entrada, probablemente será más fácil mantener un control de usuario ascx y una vista MVC Razor.

8

puede utilizar control de usuario en asp.net MVC mediante la siguiente manera

primero control de usuario el cambio de herencia ya que por defecto esta

defecto:

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

cambio:

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

2do control de usuario con controles asp.net como este dentro de la etiqueta de formulario y scr gestor de TIP debería llamar

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

tercera control de usuario de llamada en MVC Ver como

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

que debería funcionar sin ningún problema, y ​​que será beneficioso para convertir el sitio web asp.net MVC en edad, si el viejo sitio web tiene controles de usuario, es tan fácil de actualizar con la nueva tecnología en MVC.

+0

que es la mejor solución cuando se usa asp.net userconrol con MVC. –

Cuestiones relacionadas