【问题标题】:Aspx to Razor syntax converter? [closed]Aspx 到 Razor 语法转换器? [关闭]
【发布时间】:2010-12-12 17:20:16
【问题描述】:

我有大量用 C# 为 MVC 编写的 ASPX 和 ASCX 文件,我想将它们转换为新的 Razor 语法。

任何人都知道一些使这项工作更快的实用程序吗?

【问题讨论】:

标签: c# asp.net-mvc asp.net-mvc-3 razor


【解决方案1】:

我编写了一小段代码来进行转换。我认为它可能对其他人有用。我在路上学到了很多关于正则表达式的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; 
    }
}

【讨论】:

  • 您当然听过 Fredrik Lundh 的一句名言:“有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题。”感谢实用程序,迫不及待想试一试。
  • 我认为全世界都在等待一个突出正则表达式合成的工具。同时,我认为在没有正则表达式的情况下这样做需要很多代码。
  • @Olmo:我对RegExr 有很好的体验。这很棒,因为它突出显示了您悬停在正则表达式上的部分,并提供了上下文相关的帮助。您可能想尝试一下 - 他们还提供桌面版本(我还没有使用过)。
  • 哇,太棒了!非常感谢奥利弗。由于是在 Flash 中完成的,它是使用 .Net Regex 还是其他方言?
【解决方案2】:

试试这个

http://razorconverter.codeplex.com/

这是我编写的一个 codeplex 项目,它通过一些改进使 Olma 代码自动化。我认为还有一个需要 .Net 2.0 的 exe 下载,您可以将其放入您的视图文件夹中,它会自动转换所有内容。

【讨论】:

  • 这比 Telerik 的转换实用程序更有效,后者经常崩溃并且不支持母版页。
【解决方案3】:

考虑到 Razor 还没有结束测试版并且刚刚在最新的 SP 中获得了语法高亮显示,对于这样的工具来说有点太早了。

然而,谷歌发现this codeplex 项目:

该项目仍处于早期阶段,因此没有任何二进制版本。你可以下载源代码。需要VS2010编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2012-05-10
    相关资源
    最近更新 更多