Преобразуйте единственный файл aspx для кодирования позади

Еще один вариант, когда вы сначала создаете таблицу соответствия

(lookup <- do.call(rbind, lapply(mylist, stack)))
#    values ind
#a.1    Yes  AA
#a.2     No  AB
#a.3  Maybe  AC
#b.1    Yes  BA
#b.2     No  BB
#b.3  Maybe  BC

, а затем используете lapply и match для замены

lapply(myanswers, function(x) lookup$values[match(x, lookup$ind)])
#$a
#[1] "Yes"
#
#$b
#[1] "Maybe"
7
задан Community 23 May 2017 в 12:09
поделиться

5 ответов

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

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

19
ответ дан 6 December 2019 в 07:08
поделиться

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

0
ответ дан 6 December 2019 в 07:08
поделиться

Честно говоря, я не знаю быстрого пути.

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

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

2
ответ дан 6 December 2019 в 07:08
поделиться

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

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

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

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

3
ответ дан 6 December 2019 в 07:08
поделиться

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

    }
}
1
ответ дан 6 December 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: