Как преобразовать веб-сайт ASP.NET в веб-приложение ASP.NET

90

У меня есть веб-сайт ASP.NET 3.5 (жаргон визуальной студии), но он продолжает расти и, среди прочего, выглядит довольно ковбойским. Я хотел бы, чтобы это было преобразовано в веб-приложение (пространства имен и все такое).

Можно ли это легко сделать в Visual Studio? Если нет, то есть ли какие-нибудь другие инструменты, которые могли бы автоматически создавать все пространства имен и т. Д.?

RSolberg
источник
4
Этот шаблон веб-сайта - действительно ужасный POS по сравнению с шаблоном веб-приложения. Я не вижу никакой пользы от использования шаблона веб-сайта ...
Джеймс,
9
@ Джеймс - это лишь одна из многих причин, по которым я хочу отойти от этого ... Вы проповедуете хору ....
RSolberg
2
Я уверен, что приведенное ниже пошаговое руководство является очень подробным (не читал его полностью), но человек на YouTube показал очень простой способ конвертировать веб-сайт в веб-приложение здесь: youtube.com/watch?v=oXptokM0v7w - as Обычно я не могу гарантировать, что это сработает для всех. Я думаю, что этот метод будет работать для людей с небольшими и менее сложными сайтами.
dyslexicanaboko
3
Если вы используете VS2013, не забывайте, что пункт меню перемещен .
Джон

Ответы:

108

Что ж, оказывается, что опция «Преобразовать в веб-приложение» НЕ существует для «веб-сайтов». Опция «Преобразовать в веб-приложение» существует только для «веб-приложений» !!!!

[курсив мой]

Итак, вот сделка, чтобы выполнить преобразование, вам необходимо:

  • Добавьте новое «веб-приложение» в свое решение VS 2008 (Файл-> Добавить-> Новый проект-> C # -> Веб-> Веб-приложение ASP.NET).

  • После этого вы копируете все файлы со старого «веб-сайта» во вновь созданное «веб-приложение» и отменяете любые файлы, созданные в нем по умолчанию.

  • Следующий шаг - самый уродливый, вам нужно «вручную» добавить ссылки на вашем «веб-сайте» в новое «веб-приложение». Я думал, что игрушка VS 2008 PowerCommands сделает это за меня, поскольку она копирует ссылки из других типов проектов, но этого не произошло. Вы должны сделать это самостоятельно, вручную, и вы должны быть осторожны на этом этапе, если у вас есть несколько версий одной и той же сборки (например, AJAXToolkit в моем случае) или сборок, которые имеют как GAC, так и локальные версии или около того.

  • Продолжайте повторять последний шаг и пытайтесь создать «веб-приложение». Вы будете продолжать получать ошибки вроде «'....' is unknown namespace. Вам не хватает ссылки на сборку?». Убедитесь, что у вас нет ни одного из них, кроме тех, в которых "...." заменяется идентификаторами используемых вами серверных элементов управления. Другими словами, продолжайте добавлять ссылки и строить проект до тех пор, пока не будут устранены только ошибки, которые существуют из-за отсутствия файлов .DESIGNER.CS или .DESIGNER.VB.

  • После этого перейдите к корневому узлу проекта «веб-приложение» в обозревателе решений VS 2008 и щелкните его правой кнопкой мыши, после чего вы НАЙДЕТЕ параметр «Преобразовать в веб-приложение». Эта опция фактически вносит небольшие изменения в директивы «@Page» и «@Control» страниц и элементов управления и создает необходимые файлы .DESIGNER.CS или .DESIGNER.VB.

  • Попробуйте снова создать «веб-приложение». Если вы получаете ошибки, посмотрите, какие ссылки могут отсутствовать, и / или снова нажмите «Преобразовать в веб-приложение». Иногда, если есть какая-либо ошибка, кроме тех, которые вызваны отсутствием файлов DESIGNER, не для всех страниц / элементов управления будут созданы эти файлы DESIGNER. Устранение проблемы, не связанной с ДИЗАЙНЕРОМ, и повторное нажатие «Преобразовать в веб-приложение» должно сработать.

  • После успешной сборки VS вы должны быть готовы к работе. Начните тестирование своего веб-приложения. При желании вы можете щелкнуть правой кнопкой мыши корневой узел проекта «веб-приложение» в обозревателе решений VS 2008 и нажать «Свойства», затем перейти на вкладку «Веб», чтобы установить «веб-приложение» в виртуальную папку в IIS (вы можете создать новый виртуальный каталог оттуда в VS). Если вы хотите использовать виртуальный каталог IIS, который использовал старый «веб-сайт», вам необходимо сначала удалить его из IIS.

  • Обновление: при тестировании страниц обращайте САМОЕ ВНИМАНИЕ на классы в папке «App_Code», особенно на те, у которых нет NAMESPACE. Это может быть большой ловушкой. У нас возникла проблема с двумя перегрузками методов расширения в одном статическом классе, у которого не было пространства имен, один расширяет DateTime? (Nullable) и вызывает другую перегрузку, которая расширяет сам DateTime. Вызов другой перегрузки в качестве метода расширения прошел компиляцию VS 2008 и выдал ошибку компиляции ТОЛЬКО ВО ВРЕМЯ РАБОТЫ (с IIS). Изменение вызова другой перегрузки с вызова ее как метода расширения на вызов как обычного статического метода (изменение вызова только в том же классе, вызовы из других классов оставались вызовами методов расширения) решило эту проблему, но очевидно, что это не так. безопасно, как это было раньше в VS 2005.

  • Обновление 2: во время преобразования VS 2008 переименовывает ваш «App_Code» в «Old_App_Code». Это новое имя звучит некрасиво, но НЕ ПЕРЕИМЕНОВАТЬ НАЗАД. В модели «веб-приложение» весь код будет в одной сборке. Во время выполнения веб-сервер не знает, какой тип веб-проекта вы используете. Он берет весь код из папки «App_Code» и создает для него новую сборку. Таким образом, если у вас есть код в папке с именем «App_Code», вы получите ошибки компиляции RUNTIME, что одни и те же типы существуют в двух сборках, созданной VS, а другой - IIS / ASP.NET Development Server. . Чтобы этого не произошло. оставьте "Old_App_Code" с тем же именем или переименуйте его в ANYTHING EXCEPT: "App_Code". Не помещайте код в такой "App_Code"

Я знаю это раньше, но забыл об этом, так как давно не использовал модель "веб-сайт" :(.

Эндрю Хэйр
источник
2
Ваша ссылка вверху не работает, ошибка 500
Самир Алибхай
6
Также ищите файлы кода, которые нужно скопировать как «содержимое», а не «компилировать»
jcolebrand
14
Для тех из вас, кто делает это на VS2013, «Скрыть в веб-приложение» было перемещено в меню «Проект» внизу.
Эрик Сассаман
3
@EricSassaman Но для меня это совсем не касается проектов веб-сайтов.
NickG
1
@NickG, вы правы, согласно первой строке ответа, его НЕТ для проектов веб-сайтов, меню Project даже не существует, если вы не выберете веб-приложение в обозревателе решений. Если вы видите в меню «Веб-сайт», это не веб-приложение. Следуйте инструкциям выше, чтобы создать пустое веб-приложение, скопируйте в него файлы. Затем «Преобразовать в веб-приложение» должно появиться в меню проекта для вашего нового веб-приложения. Ты сделал это?
Эрик Сассаман,
13

Пошаговое руководство: преобразование проекта веб-сайта в проект веб-приложения в Visual Studio в MSDN

Если ваш сайт-приложение разрастается ... лучше разбить его на несколько проектов. Преобразование проекта веб-сайта в проект веб-приложения не сильно поможет.

Константин Таркус
источник
5

Если у вас возникли проблемы с созданием нового проекта веб-приложения, проверьте свойства файла в Visual Studio всех «вспомогательных» классов. Для проекта, который я преобразовывал, Build Action был установлен на Content, тогда как он должен был быть Compile.

Мэтт Баррелл
источник
4

Я успешно перенес один проект веб-сайта в веб-приложение, и есть несколько ошибок, на которые следует обратить внимание.

Наличие в вашем распоряжении ReSharper очень помогает в рефакторинге файлов aspx.

  1. Настройте свое решение и создайте пустое веб-приложение
  2. Копировать весь файл
  3. aspx-файлы в проектах веб-сайтов не имеют пространства имен. Оберните свои классы в соответствующие пространства имен
  4. Во время копирования все мои страницы в подпапках были переименованы в имя моего проекта и имя папки, поэтому я получил 40ish. public partial class FolderName_Projectname : PageЕсли необходимо, переименуйте все файлы с помощью Resharper или вручную. Если вы столкнулись с несколькими ошибками, например "There is already a member Page_Load() defined", это, скорее всего, связано с неправильными именами классов и дублированием
  5. После добавления пространства имен
  6. Замените CodeFileвсе aspx-страницы Codebehindна файлы в вашей подпапке и особенно обратите внимание на них. Убедитесь, что Inhertis=""не указан относительный путь. Ваши пространства имен позаботятся обо всем. Итак, правильный формат Inherits="Namespace.classname". Если у вашего класса есть пространство имен NaSpa и имя файла foo.cs, это будетInherits="NaSpa.foo"

  7. После того, как вы подготовили все свои файлы (не забудьте свои главные страницы), запустите «Преобразовать в веб-приложение». Если после этого вы обнаружите ошибки, промойте и повторите. Если вы столкнулись с ошибками типа «TextBoxName не может быть найден, отсутствует ссылка», убедитесь, что вы не забыли очистить свои aspx-страницы. Хорошим индикатором является проверка автоматически созданных файлов дизайнера. Если TextBoxNameне отображается там, преобразование не удалось полностью.

  8. Устраните все недостающие зависимости.
  9. Построить
Марко
источник
3

Создайте новое веб-приложение в VS 2010.
1. С помощью проводника Windows скопируйте все файлы в папку проекта.
2. В обозревателе решений VS 2010 отображаются все файлы.
3. Выберите файлы и папки - щелкните правой кнопкой мыши включить в проект.
4. Щелкните правой кнопкой мыши обозреватель решений проекта и выберите «Преобразовать в веб-приложение».

Есть довольно много небольших отличий, например, папка App_Code будет переименована в old_app_code, что на удивление не вызывает никаких ошибок. Для TypeName в источниках данных вашего объекта и наследуемых тегов @Page может потребоваться [ProjectName]. префикс добавлен глобально. Например, если имя вашего типа было «BusinessLogic.OrderManager», а имя проекта - InventorySystem, вам нужно будет изменить его на InventorySystem.BusinessLogic.OrderManager. Также некоторые изменения отображения, например, для валидаторов обязательных полей больше не используется красный шрифт по умолчанию, а по умолчанию черный.

Тим Самандари
источник
мой файл кода приложения не изменился, как предполагалось. Мне пришлось вручную переименовать его, а затем изменить все страницы cs для компиляции.
Майк
3

Первоначально я столкнулся с теми же проблемами. После ознакомления с книгой Wrox Professional ASP.NET 4.0 я нашел следующее решение для своего случая.

Сначала я создал новое веб-приложение. Скопировал все файлы сайта в папку веб-приложения. Щелкните приложение правой кнопкой мыши и выберите преобразовать в веб-приложение.

Вы можете спросить, зачем вам нужно преобразовывать веб-приложение в веб-приложение. Ответ таков: когда вы создаете веб-сайт, вы просто кодируете файл .cs там, где это необходимо. Однако веб-приложение автоматически объявляет файлы .design.cs (или .vb) и .cs для раздела кода и дизайна.

ДАЛЕЕ: Удалите все ручные ссылки, такие как атрибут «Наследует» в директиве PAGE, на другие файлы на вашем веб-сайте, поскольку пространства имен БУДУТ заботиться о централизованных ссылках на классы.

Я также столкнулся с проблемой, так как я не включил в свой проект папки OBJ и BIN. Если вы считаете, что вам не хватает папок BIN и OBJ, просто щелкните значок «Показать все файлы» в обозревателе решений, а затем щелкните правой кнопкой мыши отсутствующие папки и добавьте их в проект. (чтобы убедиться, что они компилируются с проектом.)

ОБНОВЛЕНИЕ: как отмечает @deadlychambers в комментариях: вы можете искать везде, нажимая «Ctrl + Shift + F», а затем искать Inherits="(.*?)". Это найдет все вхождения и, вероятно, сэкономит вам время!

Санни Р Гупта
источник
1
Вы можете удалить все с помощью Ctrl-shift-F, а затем изменить параметры поиска для регулярного выражения и использовать это Inherits = "(. *)?"
DeadlyChambers
1
Убедитесь, что это Inherits = "(. *?)", Другой будет захватывать все, что находится за наследованием, до последней кавычки.
DeadlyChambers
1
Я только что столкнулся с проблемой, когда НЕ наследование привело к тому, что дизайнер удалил пространство имен, а затем удалил класс. Я бы хотел, чтобы это было проще.
DeadlyChambers
0

пространство имен ASP по умолчанию, похоже, больше не работает. Поэтому я не могу вызывать свои страницы User Controls.ascx извне. Предоставление им пространства имен и изменение значения по умолчанию с ASP на мое пространство имен, похоже, сработало.

Майк
источник