2009-05-12 17 views
6

Estoy trabajando en un sitio web (no una aplicación web) en VS 2008 .Net 3.5 y usa el archivo único modelo .aspx donde el código del servidor está incluido en la parte de la cabeza del html en lugar de usar un código .aspx.cs detrás de la página.Convierta un solo archivo aspx al código detrás de

Me gustaría convertir rápidamente los archivos para usar el modelo de código subyacente, pero hasta ahora la única forma en que puedo hacer esto es eliminando el archivo, creando una nueva página aspx con código subyacente del mismo nombre , luego copiando manualmente en el código relacionado con aspx a la página .aspx y el código del servidor a la página .aspx.cs.

¿Hay una forma más rápida de hacerlo?

he visto dos artículos que parecen responder a esta pregunta, pero por desgracia no lo hacen: Working with Single-File Web Forms Pages in Visual Studio .NET y How do you convert an aspx or master page file to page and code behind?

Ambos ofrecen una solución simple mediante el cual VS hace el trabajo de la pierna, que acaba de apuntar a un archivo y disparar. Por alguna razón, no están funcionando. El primer artículo parece referirse a VS 2002 y el segundo parece referirse a una aplicación web.

¿Hay alguna esperanza para un sitio web?

Además, tal vez estoy viendo esto de la manera incorrecta, ¿hay alguna ventaja en el modelo de una sola página? Planeo convertir pronto todo el sitio web en una aplicación web, ¿funciona bien el modelo de página única en las aplicaciones web?

Respuesta

19

Si la conversión manual requiere demasiado tiempo y la conversión automática no funciona, creo que su única otra opción sería construir su propio convertidor. Puede escribir una aplicación de consola simple que toma una ruta de directorio en la línea de comando y procesa cada archivo en ese directorio. Esto no es demasiado difícil - aquí, voy a empezar:

using System; 
using System.IO; 

class Program 
{ 
    const string ScriptStartTag = "<script language=\"CS\" runat=\"server\">"; 
    const string ScriptEndTag = "</script>"; 

    static void Main(string[] args) 
    { 
     DirectoryInfo inPath = new DirectoryInfo(args[0]); 
     DirectoryInfo outPath = new DirectoryInfo(args[0] + "\\codebehind"); 
     if (!outPath.Exists) inPath.CreateSubdirectory("codebehind"); 
     foreach (FileInfo f in inPath.GetFiles()) 
     { 
      if (f.FullName.EndsWith(".aspx")) 
      { 
       // READ SOURCE FILE 
       string fileContents; 
       using (TextReader tr = new StreamReader(f.FullName)) 
       { 
        fileContents = tr.ReadToEnd(); 
       } 
       int scriptStart = fileContents.IndexOf(ScriptStartTag); 
       int scriptEnd = fileContents.IndexOf(ScriptEndTag, scriptStart); 
       string className = f.FullName.Remove(f.FullName.Length-5).Replace("\\", "_").Replace(":", "_"); 
       // GENERATE NEW SCRIPT FILE 
       string scriptContents = fileContents.Substring(
        scriptStart + ScriptStartTag.Length, 
        scriptEnd-(scriptStart + ScriptStartTag.Length)-1); 
       scriptContents = 
        "using System;\n\n" + 
        "public partial class " + className + " : System.Web.UI.Page\n" + 
        "{\n" + 
        " " + scriptContents.Trim() + 
        "\n}"; 
       using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name + ".cs")) 
       { 
        tw.Write(scriptContents); 
        tw.Flush(); 
       } 
       // GENERATE NEW MARKUP FILE 
       fileContents = fileContents.Remove(
        scriptStart, 
        scriptEnd - scriptStart + ScriptEndTag.Length); 
       int pageTagEnd = fileContents.IndexOf("%>"); 
       fileContents = fileContents.Insert(PageTagEnd, 
        "AutoEventWireup=\"true\" CodeBehind=\"" + f.Name + ".cs\" Inherits=\"" + className + "\" "); 
       using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name)) 
       { 
        tw.Write(fileContents); 
        tw.Flush(); 
       } 
      } 
     } 
    } 
} 

30 minutos de codificación, 30 minutos de depuración.Hay algunos errores obvios, por ejemplo, si su código contiene una etiqueta de script de cierre en cualquier lugar dentro de, entonces no se exportará correctamente. Los resultados no serán bonitos, pero esto debería ocuparse del 90% de su código, y debería poder eliminar los resultados de los problemas manualmente. Ahí, ¿eso ayuda?

+0

+1 por ir más allá proporcionando una muestra de código. – Armstrongest

+0

¡Gracias por tomarse el tiempo para proporcionar una muestra de código tan impresionante! –

+0

¡Muy bonito! ¿Pero qué pasa con las declaraciones de controles? Normalmente se declaran globalmente en el archivo generado por el diseñador. En mi caso, tengo alrededor de ~ 1000 archivos aspx que necesitan ser convertidos en código, así que realmente me gustaría no hacer ninguna edición manual. – Marcus

2

No sé de una forma de atajo para ser honesto.

Su mejor opción es crear una nueva página y copiar pegar hasta que todo funcione, luego eliminar su fuente, renombrar su nuevo archivo al nombre antiguo y reconstruir.

No es ideal, pero probablemente sea la forma más rápida/limpia/segura de cambiar de puerto.

3

Básicamente, debe crear un archivo de clase. Herede la clase de System.Web.UI.Page y luego cambie la directiva de página de la página para que apunte al código que está detrás.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="_Default" %> 

Donde Inherits es el nombre de su archivo de clase, y CodeBehind es el archivo de código que acaba de crear. Es posible que deba volver a cargar el proyecto para que el explorador de la solución muestre el archivo anidado, pero incluso si no lo hace, debería funcionar.

También puede consultar la respuesta aceptada para una alternativa. How does IIS know if it's serving a Web Site or a Web Application project?

+0

Gracias por la idea. Todavía estoy buscando una forma más simple, ya que el sitio tiene docenas de páginas. Mi método, en realidad, es más similar al sugerido por Serapth, pero puedo ver que el tuyo también funciona. Estas pueden ser las únicas opciones, pero si sigues los dos enlaces que incluí, verás que en un punto había una forma automática ... –

+0

Si hay docenas de páginas, creo que esto podría hacerse en cuestión de unas pocas horas (albiet, horas dolorosamente molestas), o si hay cientos de docenas de páginas, tal vez escribiendo una aplicación de consola simple para analizar las páginas por usted usando expresiones regulares y escribiendo en el sistema de archivos. –

0

si su archivo aspx tiene 2 secciones y puede dividirlo de manera mecánica ¿por qué no escribe solo un pequeño analizador para automatizar el trabajo? No debería ser difícil, es simplemente la manipulación de texto y un hallazgo recursivo de archivos.

1

Gracias mucho! Aquí hay una versión ligeramente modificada si su código está escrito en VB.Net. Simplemente compile y ejecute el convertidor en cada carpeta que contenga sitios aspx.

using System.IO; 
namespace Converter 
{ 
    class Program 
    { 
     const string ScriptStartTag = "<script runat=\"server\">"; 
     const string ScriptEndTag = "</script>"; 

     static void Main(string[] args) 
     { 
      string currentDirectory = System.Environment.CurrentDirectory; 

      var inPath = new DirectoryInfo(currentDirectory); 
      var outPath = new DirectoryInfo(currentDirectory); 
      if (!outPath.Exists) inPath.CreateSubdirectory("codebehind"); 
      foreach (FileInfo f in inPath.GetFiles()) 
      { 
       if (f.FullName.EndsWith(".aspx")) 
       { 
        // READ SOURCE FILE 
        string fileContents; 
        using (TextReader tr = new StreamReader(f.FullName)) 
        { 
         fileContents = tr.ReadToEnd(); 
        } 
        int scriptStart = fileContents.IndexOf(ScriptStartTag); 
        int scriptEnd = fileContents.IndexOf(ScriptEndTag, scriptStart); 
        string className = f.FullName.Remove(f.FullName.Length - 5).Replace("\\", "_").Replace(":", "_"); 
        // GENERATE NEW SCRIPT FILE 
        string scriptContents = fileContents.Substring(
         scriptStart + ScriptStartTag.Length, 
         scriptEnd - (scriptStart + ScriptStartTag.Length) - 1); 
        scriptContents = 
         "Imports System\n\n" + 
         "Partial Public Class " + className + " \n Inherits System.Web.UI.Page\n" + 
         "\n" + 
         " " + scriptContents.Trim() + 
         "\nEnd Class\n"; 
        using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name + ".vb")) 
        { 
         tw.Write(scriptContents); 
         tw.Flush(); 
        } 
        // GENERATE NEW MARKUP FILE 
        fileContents = fileContents.Remove(
         scriptStart, 
         scriptEnd - scriptStart + ScriptEndTag.Length); 
        int pageTagEnd = fileContents.IndexOf("%>"); 

        fileContents = fileContents.Insert(pageTagEnd, 
         "AutoEventWireup=\"false\" CodeBehind=\"" + f.Name + ".vb\" Inherits=\"" + className + "\" "); 
        using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name)) 
        { 
         tw.Write(fileContents); 
         tw.Flush(); 
        } 
       } 
      } 
     } 

    } 
} 
+0

Gracias por la contribución :) –

+0

¿Qué sucede si aún no hay etiquetas de guiones en las páginas? entonces tu convertidor se rompería. – Smith

Cuestiones relacionadas