C#でMVC用にかなりの量のASPXファイルとASCXファイルが作成されており、新しいRazor構文に変換したいと思います。Aspx to Razorシンタックスコンバータ?
この記事では、この仕事をより速くするユーティリティについて知っていますか?
C#でMVC用にかなりの量のASPXファイルとASCXファイルが作成されており、新しいRazor構文に変換したいと思います。Aspx to Razorシンタックスコンバータ?
この記事では、この仕事をより速くするユーティリティについて知っていますか?
私は変換を行う小さなコードを書いています。私はそれが他の人には役に立つかもしれないと思う。私は正規表現の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;
}
}
Razorがまだベータ版ではなく、最新のSPで構文の強調表示が行われていることを考えると、あまりに早すぎるツールです。このプロジェクトは、初期の段階にとどまっているため、任意のバイナリリリースを持っていない
:
しかし、Googleはthis CodePlexのプロジェクトを検索します。あなたはソースコードをダウンロードするかもしれません。コンパイルするにはVS2010が必要です。
Telerikは、ここでは変換ユーティリティをリリースしました:https://github.com/telerik/razor-converter
は試してみてください。この
http://razorconverter.codeplex.com/
それは私がそれはいくつかの改良をOLMAコードを自動書いたCodePlexのプロジェクトです。 .Net 2.0が必要なexeのダウンロードもあります。あなたのビューフォルダにドロップするだけで、自動的にすべてが変換されます。
これは、頻繁にクラッシュし、マスターページをサポートしていないtelerikの変換ユーティリティよりも優れていました。 –
このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューの投稿](/レビュー/低品質の投稿/ 18785713) – rzelek
もちろん、Fredrik Lundhの有名な言葉を聞いたことがあります。「問題に直面した人は、「私が知っている、私は正規表現を使用する」と思う人もいます。 ユーティリティのおかげで、それを渦巻きにするのを待つことはできません。 –
私は、正規表現のシンタクスを強調するツールを世界が待っていると思います。まもなく、正規表現を使わずにこれを行うには、多くのコードが必要になると思います。 – Olmo
@Olmo:私は[RegExr](http://gskinner.com/RegExr/)の経験がありました。それはあなたがホバリングしている正規表現の部分をハイライト表示し、文脈依存のヘルプを提供するのですばらしいです。試してみるといいかもしれません。デスクトップ版も提供しています(私はこれまで使っていません)。 – Oliver