2009-05-12 12 views
6

Pracuję na stronie internetowej (nie jest aplikacją internetową) w VS 2008 .Net 3.5 i używa ona pojedynczego pliku .aspx model, w którym kod serwera jest zawarty w części głowicy html zamiast używać kodu .aspx.cs za stroną.Konwersja pojedynczego pliku aspx do kodu za

Chciałbym szybko przekonwertować pliki, aby korzystać z modelu kodu, ale jak na razie jedyny sposób, w jaki mogę to zrobić, to usunięcie pliku, tworzenie nowej strony aspx o tej samej nazwie kodowej o tej samej nazwie , a następnie ręcznie skopiować kod związany z aspxem na stronę .aspx, a kod serwera na stronę .aspx.cs.

Czy jest to szybszy sposób?

Widziałem dwa artykuł, który wydają odpowiedzieć na to pytanie, ale niestety nie: Working with Single-File Web Forms Pages in Visual Studio .NET i How do you convert an aspx or master page file to page and code behind?

Obie oferują proste rozwiązanie przy czym VS działa na nogi, po prostu skierować go do plik i strzelaj. Z jakiegoś powodu nie działają. Pierwszy artykuł wydaje się odnosić do VS 2002, a drugi wydaje się odnosić do aplikacji internetowej.

Czy istnieje jakaś nadzieja dla strony internetowej?

Być może widzę to w niewłaściwy sposób, czy istnieje korzyść dla modelu jednej strony? Mam zamiar wkrótce przekształcić całą witrynę w aplikację internetową, czy model strony działa dobrze w aplikacjach internetowych?

Odpowiedz

19

Jeśli ręczna konwersja jest zbyt czasochłonna, a automatyczna konwersja nie działa, myślę, że jedyną opcją jest zbudowanie własnego konwertera. Możesz napisać prostą aplikację konsolową, która pobiera ścieżkę do katalogu w linii poleceń i przetwarza każdy plik w tym katalogu. To nie jest trudne - tutaj, zacznę:

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(); 
       } 
      } 
     } 
    } 
} 

Kodowanie 30 minut, 30 minut debugowania.Są pewne oczywiste błędy - np. Jeśli twój kod zawiera tag zamykającego skryptu w dowolnym miejscu wewnątrz, to nie zostanie poprawnie wyeksportowany. Wyniki nie będą ładne, ale powinno to zająć 90% kodu, a powinieneś być w stanie ręcznie usunąć wszelkie problemy z wynikami. Czy to pomaga?

+0

+1 za wykonanie dodatkowej czynności, dostarczając próbkę kodu. – Armstrongest

+0

Dziękujemy za poświęcenie czasu na stworzenie tak wspaniałej próbki kodu! –

+0

Bardzo ładne! Ale co z deklaracjami kontroli? Są one zwykle deklarowane globalnie w pliku generowanym przez projektanta. W moim przypadku mam około ~ 1000 plików aspx, które muszą zostać przekonwertowane na kod z tyłu, więc naprawdę nie chcę żadnej ręcznej edycji. – Marcus

2

Nie znam skrótu, aby być szczerym.

Najprawdopodobniej najlepiej jest utworzyć nową stronę i skopiować wklejenie, dopóki wszystko nie zadziała, a następnie usunąć źródło, zmienić nazwę nowego pliku na starą i odbudować.

Nie idealny, ale prawdopodobnie najszybszy/najczystszy/najbezpieczniejszy sposób na przesiadkę.

3

Zasadniczo trzeba utworzyć plik klasy. Odziedzicz klasę z System.Web.UI.Page, a następnie zmień dyrektywę strony, aby wskazywała na kod.

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

Where Inherits to nazwa pliku klasy, a CodeBehind to właśnie utworzony plik kodu. Może być konieczne ponowne załadowanie projektu, aby eksplorator rozwiązań wyświetlał zagnieżdżony plik, ale nawet jeśli nie, powinien działać.

Możesz również sprawdzić akceptowaną odpowiedź jako alternatywę. How does IIS know if it's serving a Web Site or a Web Application project?

+0

Dzięki za tę myśl. Wciąż szukam prostszego sposobu, ponieważ witryna ma dziesiątki stron. Moja metoda jest bardziej podobna do tej, którą proponował Serapth, ale widzę, że twoja również działa. To może być jedyny wybór, ale jeśli podążysz za dwoma linkami, które dołączyłem, zobaczysz, że w pewnym momencie był zautomatyzowany ... –

+0

Jeśli są to "dziesiątki" stron, myślę, że można to zrobić w ciągu kilku godzin (albiet, boleśnie irytujące godziny) lub jeśli są "setki tuzinów" stron, być może pisząc prostą aplikację konsolową, aby przeanalizować strony za pomocą wyrażeń regularnych i pisząc do systemu plików. –

0

jeśli twój plik aspx ma 2 sekcje i czy jesteś w stanie podzielić go w sposób mechaniczny, dlaczego nie piszesz tylko małego parsera, aby zautomatyzować pracę? Nie powinno to być trudne, to zwykła manipulacja tekstem i znalezienie pliku rekurencyjnego.

1

Wielkie dzięki! Oto wersja zmodyfikowana slighlty, jeśli twój kod jest napisany i VB.Net. Wystarczy skompilować i uruchomić konwerter w każdym folderze zawierającym witryny 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

Dzięki za wkład :) –

+0

co, jeśli na stronach nie ma jeszcze tagów skryptów? wtedy konwerter się zepsuł. – Smith

Powiązane problemy