2010-12-12 9 views
23

Mam znaczną ilość plików ASPX i ASCX zapisanych w C# dla MVC i chciałbym przekonwertować je do nowej składni Razor.Aspx to Razor syntax converter?

Czy znasz jakieś narzędzie, które przyspiesza pracę?

Odpowiedz

26

Napisałem mały fragment kodu, który dokonuje konwersji. Myślę, że może to być przydatne dla kogoś innego. Wiele się nauczyłem na temat regex'a balancing goup definitions.

public static class RazorConversor 
{ 
    public static void ConvertAll(string directory) 
    { 
     string[] array = Directory.GetFiles(directory, "*.aspx", SearchOption.AllDirectories).Concat(
         Directory.GetFiles(directory, "*.ascx", SearchOption.AllDirectories)).ToArray(); 

     foreach (var fileName in array) 
     { 
      string aspxCode = File.ReadAllText(fileName); 
      string razorCode = ConvertToRazor(aspxCode); 
      File.WriteAllText(fileName, razorCode); //rename manually to update .csproj & source control 
     } 
    } 

    static readonly string[] DefaultNamespaces = new string[] 
    { 
     "System.Web.Helpers", 
     "System.Web.Mvc", 
     "System.Web.Mvc.Ajax", 
     "System.Web.Mvc.Html", 
     "System.Web.Routing", 
     "System.Web.WebPages", 
    }; 

    public static string ConvertToRazor(string aspxCode) 
    { 
     return ConvertToRazor(aspxCode, DefaultNamespaces); 
    } 

    public static string ConvertToRazor(string aspxCode, string[] defaultNamespaces) 
    { 
     //namespaces 
     string text2 = Regex.Replace(aspxCode, @"<%@\s+Import Namespace=""(?<ns>.*?)""\s+%>", 
      m => defaultNamespaces.Contains(m.Groups["ns"].Value) ? null : "@using " + m.Groups["ns"].Value); 

     //headers 
     string text3 = Regex.Replace(text2, @"<%@\s(?<dir>.*?)%>", m => "@{ " + m.Groups["dir"].Value + "}"); // Preserves headers 

     //expressions 
     string text4 = Regex.Replace(text3, @"<%[=:](?<expr>.*?)%>", m => 
     { 
      string expr = m.Groups["expr"].Value.Trim(); 
      string cleanExpr = Regex.Replace(expr, @"(""(\\""|[^""])*"")|(@""([^""]|"""")*"")|(\([^\(\)]*(((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*\))", m2 => ""); 
      return cleanExpr.Contains(' ') ? "@(" + expr + ")" : "@" + expr; 
     }, RegexOptions.Singleline); 

     //code blocks 
     string text5 = Regex.Replace(text4, @"<%(?<code>.*?)%>", m => 
     { 
      string code = m.Groups["code"].Value.Trim(); 

      Dictionary<string, string> stringLiterals = new Dictionary<string,string>(); 

      code = Regex.Replace(code, @"(""(\\""|[^""])*"")|(@""([^""]|"""")*"")", m2 => 
      { 
       string key = "<$" + stringLiterals.Count + "$>"; 
       stringLiterals.Add(key, m2.Value); 
       return key; 
      }); 

      string result = Regex.Replace(code, 
       @"((?<blockHeader>(else|(for|switch|foreach|using|while|if)\s*\([^\(\)]*(((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*\))\s*)" + 
       @"((?<fullBlock>{[^{}]*(((?'OpenCurly'{)[^{}]*)+((?'CloseCurly-OpenCurly'})[^{}]*)+)*})|(?<openblock>{.*))|" + 
       @"(?<text>((?!({|}|\s)(for|switch|foreach|using|while|if|else)(\s|{|\()).)+))", 
       m2 => 
       { 
        if(m2.Value.Trim().Length == 0 || m2.Value.StartsWith("else")|| m2.Value.StartsWith("}")) 
         return m2.Value; 

        if(m2.Groups["text"].Success) 
         return "@{ " + m2.Value.Trim() + "}\r\n"; 

        return "@" + m2.Value; 
       }, RegexOptions.ExplicitCapture | RegexOptions.Singleline); 

      result = Regex.Replace(result, @"<\$\d+\$>", 
       m2 => stringLiterals[m2.Value]); 

      return result; 
     }, RegexOptions.Singleline); 

     return text5; 
    } 
} 
+4

Oczywiście słyszałeś słynny żart Fredrika Lundha: "Niektórzy ludzie, gdy mają do czynienia z problemem, myślą:" Wiem, użyję wyrażeń regularnych ". Teraz mają dwa problemy." Dzięki za narzędzie, nie możemy się doczekać, aby dać mu wir. –

+0

Myślę, że świat czeka na narzędzie, które podkreśla syntezę wyrażeń regularnych. W międzyczasie myślę, że robienie tego bez regularnej ekspresji będzie wymagało wiele kodu. – Olmo

+0

@Omo: Mam dobre doświadczenia z [RegExr] (http://gskinner.com/RegExr/). Jest świetny, ponieważ podkreśla część regexu, nad którym się znajdujesz i oferuje pomoc kontekstową. Możesz spróbować - oferują także wersję na komputery stacjonarne (której jeszcze nie używałem). – Oliver

1

Trochę za wcześnie na takie narzędzie, biorąc pod uwagę, że Razor nie jest jeszcze zwolniony z wersji beta i właśnie dostał podświetlanie składni w najnowszym SP.

Jednak google znajdzie this codeplex projekt:

Ten projekt jest wciąż w początkowej fazie, a zatem nie mają żadnego uwalnianie binarny. Możesz pobrać kod źródłowy. Potrzebujesz VS2010, aby go skompilować.

12

Telerik wydała narzędzie do konwersji tutaj: https://github.com/telerik/razor-converter

+0

Moje doświadczenie z oprogramowaniem Telerik było dość przerażające. Unikałem tego na zasadzie. –

+2

+1 dla Telerik aspx2razor, działał pięknie. To po prostu konsola exe, łatwa w użyciu. Telerik stał się przez lata o wiele lepszy. – GONeale

+0

@BenLesh naprawdę? Telerik zawsze był dla mnie miły. – BroVirus

1

Spróbuj

http://razorconverter.codeplex.com/

Jest to projekt codeplex, że napisałem, że automatyzuje kod Olma z pewnymi udoskonaleniami. Istnieje również pobieranie exe, które wymaga. Net 2.0, myślę, że można po prostu upuścić go do folderu widoku i wszystko to jest automatycznie konwertowane.

+0

To działało dla mnie lepiej niż narzędzie do konwersji telerika, które często się zawiesza i nie obsługuje stron wzorcowych. –

+1

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić w nim istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ opinia/niskiej jakości-posts/18785713) – rzelek