将单个文件aspx转换为代码隐藏

时间:2009-05-12 19:52:36

标签: asp.net visual-studio-2008 code-behind

我正在使用VS 2008 .Net 3.5中的网站(不是Web应用程序),它使用单个文件.aspx模型,其中服务器代码包含在html的头部而不是使用。 aspx.cs代码在页面后面。

我想快速转换文件以使用代码隐藏模型,但到目前为止,我能做到这一点的唯一方法是删除文件,创建一个新的,代码隐藏的同名aspx页面,然后手动将aspx相关代码复制到.aspx页面,将服务器代码复制到.aspx.cs页面。

有更快的方法吗?

我已经看过两篇文章似乎来回答这个问题,但不幸的是没有: Working with Single-File Web Forms Pages in Visual Studio .NETHow do you convert an aspx or master page file to page and code behind?

两者都提供了一个简单的解决方案,VS可以使腿部工作,只需将其指向文件并进行拍摄即可。无论出于何种原因,他们都没有工作。第一篇文章似乎是指VS 2002,第二篇似乎是指Web应用程序。

网站有什么希望吗?

另外,也许我看错的方式,单页模型有优势吗?我计划很快将整个网站转换为Web应用程序,单页模型在Web应用程序中是否运行良好?

5 个答案:

答案 0 :(得分:19)

如果手动转换过于耗时,并且自动转换无效,我认为您唯一的另一种选择就是构建自己的转换器。您可以编写一个简单的控制台应用程序,它在命令行上获取目录路径并处理该目录中的每个文件。这不是太难 - 在这里,我会让你开始:

using System;
using System.IO;

class Program
{
    const string ScriptStartTag = "<script language=\"CS\" runat=\"server\">";
    const string ScriptEndTag = "</script>";

    static void Main(string[] args)
    {
        DirectoryInfo inPath = new DirectoryInfo(args[0]);
        DirectoryInfo outPath = new DirectoryInfo(args[0] + "\\codebehind");
        if (!outPath.Exists) inPath.CreateSubdirectory("codebehind");
        foreach (FileInfo f in inPath.GetFiles())
        {
            if (f.FullName.EndsWith(".aspx"))
            {
                //  READ SOURCE FILE
                string fileContents;
                using (TextReader tr = new StreamReader(f.FullName))
                {
                    fileContents = tr.ReadToEnd();
                }
                int scriptStart = fileContents.IndexOf(ScriptStartTag);
                int scriptEnd = fileContents.IndexOf(ScriptEndTag, scriptStart);
                string className = f.FullName.Remove(f.FullName.Length-5).Replace("\\", "_").Replace(":", "_");
                //  GENERATE NEW SCRIPT FILE
                string scriptContents = fileContents.Substring(
                    scriptStart + ScriptStartTag.Length,
                    scriptEnd-(scriptStart + ScriptStartTag.Length)-1);
                scriptContents =
                    "using System;\n\n" +
                    "public partial class " + className + " : System.Web.UI.Page\n" +
                    "{\n" +
                    "    " + scriptContents.Trim() +
                    "\n}";
                using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name + ".cs"))
                {
                    tw.Write(scriptContents);
                    tw.Flush();
                }
                //  GENERATE NEW MARKUP FILE
                fileContents = fileContents.Remove(
                    scriptStart,
                    scriptEnd - scriptStart + ScriptEndTag.Length);
                int pageTagEnd = fileContents.IndexOf("%>");
                fileContents = fileContents.Insert(PageTagEnd,
                    "AutoEventWireup=\"true\" CodeBehind=\"" + f.Name + ".cs\" Inherits=\"" + className + "\" ");
                using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name))
                {
                    tw.Write(fileContents);
                    tw.Flush();
                }
            }
        }
    }
}
30分钟编码,30分钟调试。有一些明显的错误 - 比如,如果您的代码在内部的任何地方包含结束脚本标记,那么它将无法正确导出。结果不会很好,但这应该照顾90%的代码,并且您应该能够手动清理任何问题结果。那有帮助吗?

答案 1 :(得分:3)

基本上你需要创建一个类文件。从System.Web.UI.Page继承该类,然后将页面的页面指令更改为指向后面的代码。

<%@ Page Language="C#" AutoEventWireup="true"  CodeBehind="Default.aspx.cs" Inherits="_Default" %>

其中Inherits是类文件的名称,CodeBehind是您刚刚创建的代码文件。您可能需要重新加载项目以使解决方案资源管理器显示嵌套的文件,但即使您不这样做也应该有效。

您还可以查看已接受的答案以获取替代方案。 How does IIS know if it's serving a Web Site or a Web Application project?

答案 2 :(得分:2)

我不知道说实话的捷径。

您可能最好的选择是创建一个新页面并复制粘贴,直到一切正常,然后删除您的源,将您的新文件重命名为旧名称并重建。

不理想,但可能是最快/最干净/最安全的移植方式。

答案 3 :(得分:1)

非常感谢!这是一个稍微修改过的代码版本,是用VB.Net编写的。只需在包含aspx站点的每个文件夹中编译并运行转换器。

using System.IO;
namespace Converter
{
    class Program
    {
        const string ScriptStartTag = "<script runat=\"server\">";
        const string ScriptEndTag = "</script>";

        static void Main(string[] args)
        {
            string currentDirectory = System.Environment.CurrentDirectory;

            var inPath = new DirectoryInfo(currentDirectory);
            var outPath = new DirectoryInfo(currentDirectory);
            if (!outPath.Exists) inPath.CreateSubdirectory("codebehind");
            foreach (FileInfo f in inPath.GetFiles())
            {
                if (f.FullName.EndsWith(".aspx"))
                {
                    //  READ SOURCE FILE
                    string fileContents;
                    using (TextReader tr = new StreamReader(f.FullName))
                    {
                        fileContents = tr.ReadToEnd();
                    }
                    int scriptStart = fileContents.IndexOf(ScriptStartTag);
                    int scriptEnd = fileContents.IndexOf(ScriptEndTag, scriptStart);
                    string className = f.FullName.Remove(f.FullName.Length - 5).Replace("\\", "_").Replace(":", "_");
                    //  GENERATE NEW SCRIPT FILE
                    string scriptContents = fileContents.Substring(
                        scriptStart + ScriptStartTag.Length,
                        scriptEnd - (scriptStart + ScriptStartTag.Length) - 1);
                    scriptContents =
                        "Imports System\n\n" +
                        "Partial Public Class " + className + " \n Inherits System.Web.UI.Page\n" +
                        "\n" +
                        "    " + scriptContents.Trim() +
                        "\nEnd Class\n";
                    using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name + ".vb"))
                    {
                        tw.Write(scriptContents);
                        tw.Flush();
                    }
                    //  GENERATE NEW MARKUP FILE
                    fileContents = fileContents.Remove(
                        scriptStart,
                        scriptEnd - scriptStart + ScriptEndTag.Length);
                    int pageTagEnd = fileContents.IndexOf("%>");

                    fileContents = fileContents.Insert(pageTagEnd,
                        "AutoEventWireup=\"false\" CodeBehind=\"" + f.Name + ".vb\" Inherits=\"" + className + "\" ");
                    using (TextWriter tw = new StreamWriter(outPath.FullName + "\\" + f.Name))
                    {
                        tw.Write(fileContents);
                        tw.Flush();
                    }
                }
            }
        }

    }
}

答案 4 :(得分:0)

如果您的aspx文件有2个部分,并且您能够以机械方式将其拆分,为什么不编写一个小的解析器来自动完成工作?不应该很难,它只是纯文本操作和递归文件查找。