Конвертировать один файл aspx в код позади - PullRequest
7 голосов
/ 12 мая 2009

Я работаю над веб-сайтом (не веб-приложением) в VS 2008.Net 3.5, и он использует модель отдельного файла .aspx, где код сервера включен в заголовочную часть html вместо использования a. Код aspx.cs позади страницы.

Я бы хотел быстро преобразовать файлы для использования модели с выделенным кодом, но пока единственный способ, которым я могу это сделать, - это удалить файл, создать новую страницу aspx с выделенным кодом с тем же именем, затем вручную скопируйте код, связанный с aspx, на страницу .aspx, а код сервера - на страницу .aspx.cs.

Есть ли более быстрый способ сделать это?

Я видел две статьи, которые кажутся , чтобы ответить на этот вопрос, но, к сожалению, нет: Работа с однофайловыми страницами веб-форм в Visual Studio .NET и Как преобразовать aspx или файл главной страницы в страницу и код позади?

Оба предлагают простое решение, при котором VS выполняет работу ноги, вы просто указываете на файл и снимаете. По какой-то причине они не работают. Кажется, что первая статья относится к VS 2002, а вторая относится к веб-приложению.

Есть ли надежда на веб-сайт?

Кроме того, может быть, я вижу это неправильно, есть ли преимущество у одностраничной модели? Я планирую в ближайшее время преобразовать весь веб-сайт в веб-приложение. Хорошо ли работает одностраничная модель в веб-приложениях?

Ответы [ 5 ]

19 голосов
/ 19 мая 2009

Если ручное преобразование требует слишком много времени, а автоматическое преобразование не работает, я думаю, что единственным вариантом для вас будет создание собственного конвертера. Вы можете написать простое консольное приложение, которое принимает путь к каталогу в командной строке и обрабатывает каждый файл в этом каталоге. Это не так сложно - вот, я начну с вас:

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% вашего кода, и вы сможете убрать любые проблемы вручную. Там это помогает?

3 голосов
/ 13 мая 2009

В основном вам нужно создать файл класса. Унаследуйте класс от System.Web.UI.Page, а затем измените директиву страницы, чтобы она указала на код позади.

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

Где Inherits - имя файла вашего класса, а CodeBehind - файл кода, который вы только что создали. Возможно, вам придется перезагрузить проект, чтобы обозреватель решений отображал вложенный файл, но даже если вы этого не сделаете, он должен работать.

Вы также можете проверить принятый ответ для альтернативы. Как IIS узнает, обслуживает ли он веб-сайт или проект веб-приложения?

2 голосов
/ 12 мая 2009

Я не знаю кратчайшего пути, чтобы быть честным.

Вероятно, вам лучше всего создать новую страницу и скопировать вставку, пока все не будет работать, затем удалить исходный код, переименовать новый файл в старое имя и перестроить.

Не идеально, но, вероятно, самый быстрый / чистый / безопасный способ переноса через порт.

1 голос
/ 20 ноября 2009

Большое спасибо! Вот немного измененная версия, если ваш код написан в 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();
                    }
                }
            }
        }

    }
}
0 голосов
/ 16 мая 2009

, если в вашем aspx-файле есть 2 раздела, и вы можете разбить его механическим способом, почему вы не пишете небольшой анализатор для автоматизации работы? Это не должно быть сложно, это просто обычное манипулирование текстом и рекурсивный поиск файла.

...