Como converter site ASP.NET em aplicativo da web ASP.NET


90

Eu tenho um site ASP.NET 3.5 (linguagem de estúdio visual), mas o site continua a crescer e parece meio caubói, entre outras coisas. Eu gostaria de ver isso sendo convertido em um aplicativo da Web (namespaces e tudo).

Isso é algo que pode ser feito facilmente no Visual Studio? Se não, existem outras ferramentas por aí que poderiam criar todos os namespaces, etc. de forma automática?


4
Esse modelo de site é um PDV realmente horrível em comparação com o modelo de aplicativo da web. Não consigo ver qualquer benefício em usar o modelo de site ...
James,

9
@James - apenas uma das muitas razões pelas quais procuro me afastar disso ... Você está pregando para o coro ....
RSolberg

2
Tenho certeza de que o passo a passo abaixo é muito completo (não li tudo), mas uma pessoa no youtube mostrou uma maneira muito simples de converter um site em um aplicativo da web aqui: youtube.com/watch?v=oXptokM0v7w - as usual Não posso garantir que isso funcionará para todos. Acho que esse método funcionará para pessoas com sites menores e menos complicados.
dyslexicanaboko

3
Se você estiver usando o VS2013, não se esqueça que o item de menu foi movido .
Jon

Respostas:


108

Bem, verifica-se que a opção "Converter para aplicativo da web" NÃO existe para "sites". A opção "Converter para aplicativo da web" existe apenas para "aplicativos da web" !!!!

[ênfase minha]

Então, o negócio é o seguinte: para fazer a conversão, você precisa:

  • Adicione um novo "Aplicativo Web" à sua solução VS 2008 (Arquivo-> Adicionar-> Novo Projeto-> C # -> Web-> Aplicativo Web ASP.NET).

  • Depois disso, você copia todos os arquivos do "site" antigo para o "aplicativo da web" recém-criado e substitui todos os arquivos criados nele por padrão

  • O próximo passo é o mais feio, você precisa adicionar "manualmente" as referências do seu "site" ao novo "aplicativo web". Achei que o VS 2008 PowerCommands faria isso por mim, pois copia referências de outros tipos de projeto, mas não o fez. Você deve fazer isso sozinho, manualmente, e deve ser cauteloso nesta etapa se tiver várias versões do mesmo assembly (como AJAXToolkit no meu caso) ou assemblies que têm versões locais e do GAC ou assim.

  • Continue repetindo a última etapa e tentando construir o "aplicativo da web". Você continuará recebendo erros como "'....' é um namespace desconhecido. Está faltando uma referência de assembly?". Certifique-se de não ter nenhum desses, exceto aqueles onde '....' é substituído pelos IDs dos controles de servidor que você usa. Em outras palavras, continue adicionando referências e construindo o projeto até apenas os erros que existem por causa dos arquivos .DESIGNER.CS ou .DESIGNER.VB ausentes.

  • Em seguida, vá para o nó do projeto raiz "aplicativo da web" no explorador de soluções do VS 2008 e clique com o botão direito nele, então você encontrará a opção "Converter para aplicativo da web". O que essa opção faz é, na verdade, fazer pequenas alterações nas diretivas "@Page" e "@Control" das páginas e controles e criar os arquivos .DESIGNER.CS ou .DESIGNER.VB necessários.

  • Tente construir o "aplicativo da web" novamente. Se você receber erros, veja quais referências podem estar faltando e / ou clique em "Converter para aplicativo da web" novamente. Às vezes, se houver algum erro diferente daqueles causados ​​pela falta de arquivos DESIGNER, nem todas as páginas / controles terão esses arquivos DESIGNER criados para eles. Corrigir o problema não DESIGNER e clicar em "Converter para aplicativo da web" novamente deve resolver o problema.

  • Depois de concluir a construção do VS com sucesso, você deve estar pronto para começar. Comece a testar seu aplicativo da web. Opcionalmente, você pode clicar com o botão direito do mouse no nó do projeto raiz "aplicativo da web" no VS 2008 Solution Explorer e clicar em "Propriedades" e ir para a guia "Web" para definir o "aplicativo da web" para uma pasta virtual no IIS (você pode criar novos diretório virtual de lá no VS). Se você quiser usar o diretório virtual IIS que o antigo "site" usava, primeiro é necessário removê-lo do IIS.

  • Atualização: Ao testar suas páginas, preste MAIOR ATENÇÃO às classes na pasta "App_Code", especialmente aquelas sem NAMESPACE. Isso pode ser uma grande armadilha. Tivemos um problema com duas sobrecargas de método de extensão na mesma classe estática que não tinha namespace, uma estende DateTime? (Anulável) e chama outra sobrecarga que estende o próprio DateTime. Chamar a outra sobrecarga como método de extensão passou na compilação do VS 2008 e nos deu um erro de compilação SOMENTE EM RUNTIME (com IIS). Alterar a chamada para a outra sobrecarga de chamá-la como método de extensão para chamá-la como método estático normal (apenas alterando a chamada na mesma classe, chamadas de outras classes permaneceram chamadas de método de extensão) resolveu este, mas claramente, não é tão seguro como costumava ser no VS 2005.

  • Update2: Durante a conversão, o VS 2008 renomeia seu "App_Code" para "Old_App_Code". Este novo nome parece feio, mas NÃO O RENOMETE DE VOLTA. No modelo de "aplicativo da web", todo o código estará em um assembly. Em tempo de execução, o servidor da web não sabe qual tipo de projeto da web você está usando. Ele pega todo o código na pasta "App_Code" e cria um novo assembly para ele. Dessa forma, se você tiver o código na pasta chamada "App_Code", você acabará com erros de compilação RUNTIME, pois os mesmos tipos existem em dois assemblies, o criado pelo VS e o criado pelo IIS / ASP.NET Development Server . Para evitar isso. deixe o "Old_App_Code" com o mesmo nome, ou renomeie-o para QUALQUER COISA, EXCETO: "App_Code". Não coloque nenhum código em "App_Code"

Eu sei disso desde antes, mas esqueci agora porque não uso o modelo de "site" há muito tempo :(.


2
Seu link está quebrado na parte superior, Erro 500
Sameer Alibhai

6
Além disso, procure os arquivos de código a serem copiados como "conteúdo" e não "compilar"
jcolebrand

14
Para aqueles que estão fazendo isso no VS2013, "Covert to Web App" foi movido para o menu Project, na parte inferior.
Eric Sassaman de

3
@EricSassaman Mas não está lá para projetos de Web sites para mim.
NickG

1
@NickG, você está correto, pela primeira linha da resposta, ele NÃO está lá para projetos de sites, o menu Projeto nem existe a menos que você selecione um Aplicativo Web no Explorador de Soluções. Se você vir "Site" no menu, não é um aplicativo da web. Siga as etapas acima para criar um aplicativo da Web em branco, copie seus arquivos nele. Em seguida, "Converter para aplicativo da Web" deve estar no menu do projeto para seu novo aplicativo da Web. Você fez isso?
Eric Sassaman


5

Se você estiver tendo problemas para construir seu novo projeto de aplicativo da Web, verifique as propriedades do arquivo no Visual Studio de todas as classes 'auxiliares'. Para um projeto que eu estava convertendo, a Ação de construção estava definida como Conteúdo, mas deveria ser Compilar.


3

Crie um novo aplicativo Web no VS 2010.
1. Usando o Windows Explorer, copie todos os seus arquivos para a pasta do projeto.
2. No gerenciador de soluções do VS 2010, mostre todos os arquivos.
3. Selecione os arquivos e pastas - clique com o botão direito em incluir no projeto.
4. Clique com o botão direito no explorador de solução do projeto e selecione Converter para aplicativo da web.

Existem algumas pequenas diferenças, como a pasta App_Code será renomeada para old_app_code - que surpreendentemente não causa nenhum erro. O TypeName em suas fontes de dados de objeto e as heranças na tag @Page podem precisar do [ProjectName]. prefixo anexado globalmente. Por exemplo, se o nome do tipo for "BusinessLogic.OrderManager" e o nome do projeto for InventorySystem, você precisará alterá-lo para InventorySystem.BusinessLogic.OrderManager. Além disso, algumas alterações de exibição, como validadores de campo obrigatórios não são mais padronizados para fonte vermelha, mas para preto.


meu arquivo de código do aplicativo não mudou como deveria. Tive que renomeá-lo manualmente e, em seguida, alterar todas as páginas cs para compilar.
Mike

3

Eu estava enfrentando os mesmos problemas inicialmente. Depois de seguir o livro Wrox Professional ASP.NET 4.0, encontrei a seguinte solução para o meu caso.

Primeiro criei um novo aplicativo da web. Copiou todos os arquivos do site para a pasta do aplicativo da web. Clique com o botão direito do mouse no aplicativo e clique em converter para aplicativo da web.

Você pode perguntar por que precisa converter um aplicativo da web em um aplicativo da web. A resposta é que, ao criar um site, você simplesmente codifica o arquivo .cs onde for necessário. Um aplicativo da web, entretanto, declara .design.cs (ou .vb) e um arquivo .cs para o código e a seção de design automaticamente.

A SEGUIR: Remova todas as referências manuais, como o atributo 'Inherits' na diretiva PAGE, para outros arquivos em seu site, uma vez que os namespaces IRÃO cuidar de referenciar as classes centralmente.

Também enfrentei um problema, pois não incluí a pasta OBJ e BIN em meu projeto. Se você acha que está faltando as pastas BIN e OBJ, basta clicar no ícone 'Mostrar todos os arquivos' no Gerenciador de Soluções e, a seguir, clicar com o botão direito nas pastas ausentes e adicionar ao projeto. (para garantir que eles compilem com o projeto.)

ATUALIZAÇÃO: Como @deadlychambers aponta nos comentários: Você pode pesquisar em qualquer lugar fazendo "Ctrl + Shift + F" e depois pesquisar Inherits="(.*?)". Isso encontrará todas as ocorrências e provavelmente economizará algum tempo!


1
Você pode remover tudo com Ctrl-shift-F e, em seguida, alterar as opções de pesquisa para expressão regular e usar este Inherits = "(. *)?"
DeadlyChambers de

1
Verifique se é Inherits = "(. *?)" O outro pegará tudo atrás de herda até a última aspa.
DeadlyChambers

1
Acabei de ter um problema em que NÃO ter heranças fazia com que o designer excluísse o namespace e, em seguida, excluísse a classe. Eu gostaria que isso fosse mais fácil.
DeadlyChambers

3

Agora migrei com sucesso um projeto de site para um aplicativo da web e ainda há algumas pegadinhas a serem observadas.

Ter o ReSharper à sua disposição ajuda muito na refatoração dos arquivos aspx.

  1. Configure sua solução e crie um WebApplication vazio
  2. Copiar todo o arquivo
  3. arquivos aspx em projetos de site não têm um namspace. Envolva suas classes nos namespaces apropriados
  4. Durante a cópia, todas as minhas páginas em subpastas foram renomeadas para o nome do meu projeto e o nome da pasta, então eu obtive 40ish public partial class FolderName_Projectname : Pagese necessário renomear todos os arquivos usando Resharper ou manualmente. Se você encontrar vários erros como "There is already a member Page_Load() defined", isso é provavelmente devido a nomes de classe incorretos e duplicação
  5. Depois de adicionar um namespace
  6. Substitua CodeFileem todas as páginas aspx por Codebehinde preste atenção especialmente aos arquivos em sua subpasta. Certifique-se de Inhertis=""que não contém o caminho relativo. Seus namespaces cuidam de tudo. Portanto, o formato correto é Inherits="Namespace.classname". Se sua classe tiver um namespace NaSpa e um nome de arquivo foo.cs, seriaInherits="NaSpa.foo"

  7. Depois de preparar todos os arquivos (não se esqueça das páginas mestras), execute "Converter para aplicativo da web". Se você encontrar erros depois, enxágue e repita. Se você encontrar erros do tipo "TextBoxName não pode ser encontrado, falta uma referência", certifique-se de não esquecer de limpar suas páginas aspx. Um bom indicador é verificar os arquivos de designer gerados automaticamente. Se TextBoxNamenão aparecer lá, a conversão não foi totalmente bem-sucedida.

  8. Resolva todas as dependências ausentes.
  9. Construir

0

o espaço de nomes ASP padrão parece não funcionar mais. Portanto, não consigo chamar minhas páginas User Controls.ascx de fora da página. Dar a eles um namespace e mudar o padrão de ASP para meu namespace pareceu funcionar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.