【发布时间】:2010-12-12 17:20:16
【问题描述】:
我有大量用 C# 为 MVC 编写的 ASPX 和 ASCX 文件,我想将它们转换为新的 Razor 语法。
任何人都知道一些使这项工作更快的实用程序吗?
【问题讨论】:
-
Telerik 在这里发布了一个转换工具:github.com/telerik/razor-converter
标签: c# asp.net-mvc asp.net-mvc-3 razor
我有大量用 C# 为 MVC 编写的 ASPX 和 ASCX 文件,我想将它们转换为新的 Razor 语法。
任何人都知道一些使这项工作更快的实用程序吗?
【问题讨论】:
标签: c# asp.net-mvc asp.net-mvc-3 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;
}
}
【讨论】:
试试这个
http://razorconverter.codeplex.com/
这是我编写的一个 codeplex 项目,它通过一些改进使 Olma 代码自动化。我认为还有一个需要 .Net 2.0 的 exe 下载,您可以将其放入您的视图文件夹中,它会自动转换所有内容。
【讨论】:
考虑到 Razor 还没有结束测试版并且刚刚在最新的 SP 中获得了语法高亮显示,对于这样的工具来说有点太早了。
然而,谷歌发现this codeplex 项目:
该项目仍处于早期阶段,因此没有任何二进制版本。你可以下载源代码。需要VS2010编译。
【讨论】: