Domanda

Sto lavorando su un sito web (non un'applicazione web) in VS 2008 Net 3.5 e utilizza il modello di aspx singolo file in cui il codice del server è incluso nella porzione di testa del html invece di utilizzare un. codice aspx.cs dietro pagina.

Mi piacerebbe convertire rapidamente i file per utilizzare il modello code-behind, ma finora l'unico modo che posso fare questo è di rimuovere il file, la creazione di una nuova, code-behind pagina aspx con lo stesso nome, poi copiare manualmente nel codice relativo aspx alla pagina aspx e il codice del server alla pagina .aspx.cs.

C'è un modo più veloce per fare questo?

Ho visto due articolo che sembrano Per rispondere a questa domanda, ma purtroppo non lo fanno: Lavorare con Web Single-File Forms pagine in visual Studio .NET e Come fare si converte un file della pagina aspx o un master alla pagina e codice dietro?

Entrambi offrono una soluzione semplice per cui VS fa il lavoro di gambe, basta puntare su un file e sparare. Per una qualche ragione, non stanno lavorando. Il primo articolo sembra riferirsi a VS 2002 e il secondo sembra riferirsi ad un'applicazione web.

C'è qualche speranza per un sito web?

Inoltre, forse sto vedendo questo nel modo sbagliato, c'è un vantaggio per il modello di singola pagina? Io intenzione di convertire l'intero sito web per un'applicazione web presto, fa il modello di singola pagina funziona bene in applicazioni web?

È stato utile?

Soluzione

Se la conversione manuale è troppo alta intensità di tempo, e la conversione automatica non funziona, penso che la tua unica altra opzione sarebbe quella di costruire il proprio convertitore. Si potrebbe scrivere una semplice console app che prende un percorso di directory sulla riga di comando ed elabora tutti i file nella directory. Questo non è troppo difficile - qui, io Ti iniziare:

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 minuti di codifica, a 30 minuti di debug. Ci sono alcuni evidenti errori - come, se il codice contiene un tag script di chiusura ovunque all'interno , allora non ottenere esportati correttamente. I risultati non saranno abbastanza, ma questo dovrebbe prendersi cura di 90% del codice, e si dovrebbe essere in grado di ripulire alcun risultato problema manualmente. Lì, vuol aiutare?

Altri suggerimenti

In sostanza è necessario creare un file di classe. Ereditare la classe da System.Web.UI.Page e quindi modificare la direttiva di pagina della pagina per puntare al codice dietro.

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

Dove Inherits è il nome del file di classe, e la CodeBehind è il file di codice che avete appena creato. Potrebbe essere necessario ricaricare il progetto per ottenere l'esploratore soluzione per visualizzare il file annidati, ma anche se non si dovrebbe funzionare.

È anche possibile controllare la risposta accettato di un'alternativa. Come funziona IIS so se è al servizio di un sito Web o un progetto di applicazione Web?

Non so di una scorciatoia per essere onesti.

La cosa probabilmente migliore è quella di creare una nuova pagina e copiare incollare tutto fino a quando tutto funziona, quindi eliminare la sorgente, rinominare il nuovo file per il vecchio nome e ricostruire.

Non è l'ideale, ma probabilmente il / pulito / modo più veloce più sicuro alla porta sopra.

Grazie mille! Ecco una versione leggermente modificata del codice che ho scritto è VB.Net. Basta compilare ed eseguire il convertitore in ogni cartella che contiene i siti 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();
                    }
                }
            }
        }

    }
}

se il file aspx ha 2 sezioni e il vostro sono in grado di dividere in modo meccanico il motivo per cui non si scrive solo un piccolo parser per automatizzare il lavoro? Non dovrebbe essere difficile, è solo la manipolazione di testo e un file di scoperta ricorsiva.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top