I have a considerable amount of ASPX and ASCX files writed in C# for MVC and I would like to convert them to the new Razor syntax.
Any body knows about some utility that makes this job faster?
I have a considerable amount of ASPX and ASCX files writed in C# for MVC and I would like to convert them to the new Razor syntax.
Any body knows about some utility that makes this job faster?
I've written a small piece of code that makes the conversion. I think it could be useful to somebody else. I've learned a lot about regex's balancing goup definitions on the way.
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;
}
}
A bit too early for such a tool, considering that Razor is not yet out of beta and just got syntax highlighting in the latest SP.
However, a google finds this codeplex project:
This project is still in early stage and thus does not have any binary release. You might download the source code. You need VS2010 to compile it.
Try this
http://razorconverter.codeplex.com/
It is a codeplex project that I wrote that automates Olma code with some refinements. There is also an exe download that requires .Net 2.0 I think and you can just drop it into your view folder and it converts everything automatically.