Usar um legado ASP.NET controlo de utilizador ASCX na vista de navalha MVC

Estou a tentar implementar uma navalha de MVC.página cshtml que usa um controle de usuário ascx webform (não MVC). Estou a fazer isto com base na secção" Sim "deste artigo de Scott Hansleman" misturando visões de navalha e páginas mestre WebForms com ASP.NET MVC 3" http://www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspx

o artigo diz como usar o mesmo controlo de utilizador ascx em ambos os sites webform.Página principal, bem como uma navalha MVC _Layout pagina.

pelo que li em outro lugar no Stackoverflow é possível usar os controles de usuário do ascx legacy (bem como ASP.NET webform server controls) em páginas MVC. A utilização da seguinte linha deverá tornar o controlo do utilizador ascx na minha _Layout:

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

No entanto, isso lança o erro:

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

também tentei o seguinte com resultados semelhantes:

@Html.Partial("~/UserControls/WebUserControl1.ascx")
O que me está a escapar?

Author: Community, 2011-10-29

3 answers

Como diz a mensagem de erro, o controlo do utilizador "deve derivar de ... ViewUserControl". No código atrás do arquivo para o seu controle de usuário, basta alterar isso...

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

... a isto:

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

ViewUserControl herda de UserControl, por isso continuará a funcionar nas suas páginas web existentes.

Você pode ter que lidar com problemas adicionais para além deste, a fim de obter o seu controle de usuário para trabalhar em MVC, no entanto. Pelo menos um outro que encontrei é (aludido por esclavagistas):

O controlo 'controlId' do tipo 'controlType' deve ser colocado dentro de uma marca de formulário com runat=server.

Se encontrares coisas destas, vais ter de ser criativo. Modifique o controle do Usuário para que ele possa viver feliz em ambos WebForms e MVC (substitua os controles ofensivos por equivalentes HTML genéricos - com todas as implicações disso), ou duplicá-lo para que você tenha uma versão WebForms e uma versão MVC.

Para exemplo, você terá que substituir coisas como <asp:TextBox ID="search"> por <input type="text" name="search" />, o que significa que você também precisa modificar o código do lado do servidor que lida com o valor que vem dessa entrada. Basicamente você tem que neutralizar o controle do Usuário, convertendo-o de algo que costumava incorporar tanto ver rendering logic e pós-back handling logic, em algo que apenas torna uma vista.

Vocêpode fazer um ascx Controle jogar bem com ambos WebForms e Razor MVC, e para coisas simples como cabeçalhos de páginas e rodapés ou vistas de dados apenas para leitura, esta é uma boa abordagem para migrar uma aplicação para MVC. Mas para coisas mais complexas, como formulários de entrada, provavelmente será mais fácil manter tanto um controle de usuário ascx e uma visão de navalha MVC.

 16
Author: Daniel Schilling, 2017-05-23 12:26:08

Pode usar asp.net controlo do utilizador em MVC da seguinte forma

Primeira alteração da herança de controlo do utilizador por omissão

Predefinição:

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

Alteração:

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

Segundo controlo de utilizador com asp.net controlos como este dentro da marca do formulário e do Gestor de programas devem ser call

<%@ 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º controlo do utilizador de chamadas na área de MVC como

@{ Html.RenderPartial("~/UserControls/TestControl.ascx"); }
Deve funcionar sem qualquer problema, e será benéfico converter o velho asp.net website para MVC, se Antigo website ter controles de usuário, é tão fácil de atualizar com a nova tecnologia em MVC.
 9
Author: adnan, 2015-10-22 08:03:33

Você não pode usar o classic ASP.Net usercontrols (w / postbacks e ViewState) em ASP.Net acidente de viação.

Html.Partial só lhe permite renderizar visualizações parciais, que por acaso usam a mesma extensão, mas não são as mesmas.

 3
Author: SLaks, 2014-07-08 15:42:21