วิธีการแปลงเว็บไซต์ ASP.NET เป็นเว็บแอปพลิเคชัน ASP.NET


90

ฉันมีเว็บไซต์ ASP.NET 3.5 (ศัพท์แสงวิชวลสตูดิโอ) แต่ไซต์ยังคงเติบโตและดูค่อนข้างคาวบอยเหนือสิ่งอื่นใด ฉันต้องการเห็นสิ่งนี้ถูกแปลงเป็น Web Application (เนมสเปซและทั้งหมด)

นี่คือสิ่งที่สามารถทำได้อย่างง่ายดายใน Visual Studio หรือไม่? ถ้าไม่มีมีเครื่องมืออื่นที่สามารถสร้างเนมสเปซทั้งหมด ฯลฯ โดยอัตโนมัติได้หรือไม่?


4
เทมเพลตเว็บไซต์นั้นเป็น POS ที่แย่มากเมื่อเทียบกับเทมเพลต Web Application ฉันไม่เห็นประโยชน์ใด ๆ จากการใช้เทมเพลตเว็บไซต์ ...
James

9
@ เจมส์ - เพียงหนึ่งในหลาย ๆ เหตุผลที่ฉันต้องการจะย้ายออกไปจากมัน ... คุณกำลังเทศนากับนักร้องประสานเสียง ....
RSolberg

2
ฉันแน่ใจว่าคำแนะนำด้านล่างนี้ละเอียดมาก (ไม่ได้อ่านทั้งหมด) แต่คนใน youtube แสดงวิธีง่ายๆในการแปลงเว็บไซต์เป็นเว็บแอปที่นี่: youtube.com/watch?v=oXptokM0v7w - as โดยปกติฉันไม่สามารถรับประกันได้ว่าสิ่งนี้จะใช้ได้กับทุกคน ฉันคิดว่าวิธีนี้ใช้ได้กับผู้ที่มีไซต์เล็ก ๆ ที่ซับซ้อนน้อยกว่า
dyslexicanaboko

3
หากคุณใช้ VS2013 อย่าลืมว่ารายการเมนูได้ย้ายไปแล้ว
จอน

คำตอบ:


108

ปรากฎว่าไม่มีตัวเลือก "Convert to web application" สำหรับ "เว็บไซต์" ตัวเลือก "แปลงเป็นเว็บแอปพลิเคชัน" มีไว้สำหรับ "เว็บแอปพลิเคชัน" เท่านั้น !!!!

[เน้นเหมือง]

ดังนั้นนี่คือข้อตกลงในการแปลงคุณต้อง:

  • เพิ่ม "Web Application" ใหม่ในโซลูชัน VS 2008 ของคุณ (File-> Add-> New Project-> C # -> Web-> ASP.NET Web Application)

  • หลังจากนั้นคุณคัดลอกไฟล์ทั้งหมดใน "เว็บไซต์" เก่าไปยัง "เว็บแอปพลิเคชัน" ที่สร้างขึ้นใหม่และแทนที่ไฟล์ใด ๆ ที่สร้างขึ้นตามค่าเริ่มต้น

  • ขั้นตอนต่อไปน่าเกลียดที่สุดคุณต้อง "เพิ่มการอ้างอิงใน" เว็บไซต์ "ของคุณลงใน" เว็บแอปพลิเคชัน "ใหม่ด้วยตนเอง ฉันคิดว่าของเล่น VS 2008 PowerCommands จะทำสิ่งนี้ให้ฉันเพราะมันคัดลอกการอ้างอิงจากโครงการประเภทอื่น แต่มันไม่ได้ คุณต้องทำด้วยตัวเองด้วยตนเองและคุณต้องระมัดระวังในขั้นตอนนี้หากคุณมีแอสเซมบลีเดียวกันหลายเวอร์ชัน (เช่น AJAXToolkit ในกรณีของฉัน) หรือแอสเซมบลีที่มีทั้ง GAC และเวอร์ชันท้องถิ่นหรือมากกว่านั้น

  • ทำซ้ำขั้นตอนสุดท้ายและพยายามสร้าง "เว็บแอปพลิเคชัน" คุณจะได้รับข้อผิดพลาดเช่น "" .... "คือเนมสเปซที่ไม่รู้จักคุณขาดการอ้างอิงการประกอบหรือไม่" ตรวจสอบให้แน่ใจว่าคุณไม่มีสิ่งเหล่านี้ยกเว้นรายการที่ ".... " ถูกแทนที่ด้วย ID ของตัวควบคุมเซิร์ฟเวอร์ที่คุณใช้ กล่าวอีกนัยหนึ่งให้เพิ่มการอ้างอิงและสร้างโครงการต่อไปจนกว่าจะมีเพียงข้อผิดพลาดที่มีอยู่เนื่องจากไม่มีไฟล์. DESIGNER.CS หรือ. DESIGNER.VB

  • หลังจากนั้นไปที่โหนดโปรเจ็กต์รูท "เว็บแอปพลิเคชัน" ใน VS 2008 solution explorer แล้วคลิกขวาจากนั้นคุณจะพบตัวเลือก "Convert to web application" สิ่งที่ตัวเลือกนี้ทำคือการเปลี่ยนแปลงเล็กน้อยกับคำสั่ง "@Page" และ "@Control" ของเพจและตัวควบคุมและการสร้างไฟล์. DESIGNER.CS หรือ .DESIGNER.VB ที่จำเป็น

  • ลองสร้าง "เว็บแอปพลิเคชัน" อีกครั้ง หากคุณได้รับข้อผิดพลาดโปรดดูข้อมูลอ้างอิงที่อาจขาดหายไปและ / หรือไปคลิก "แปลงเป็นเว็บแอปพลิเคชัน" อีกครั้ง ในบางครั้งหากมีข้อผิดพลาดนอกเหนือจากที่เกิดจากไฟล์ DESIGNER ที่หายไปไม่ใช่ว่าหน้า / ส่วนควบคุมทั้งหมดจะมีไฟล์ DESIGNER ที่สร้างขึ้นสำหรับพวกเขา การแก้ไขปัญหาที่ไม่ใช่ของ DESIGNER และคลิก "แปลงเป็นเว็บแอปพลิเคชัน" อีกครั้งควรดำเนินการนี้

  • เมื่อคุณสร้าง VS สร้างสำเร็จแล้วคุณควรพร้อมที่จะไป เริ่มทดสอบเว็บแอปพลิเคชันของคุณ คุณสามารถคลิกขวาที่โหนดโปรเจ็กต์รูท "เว็บแอปพลิเคชัน" ใน VS 2008 Solution Explorer แล้วคลิก "Properties" จากนั้นไปที่แท็บ "Web" เพื่อตั้งค่า "web application" ให้เป็นโฟลเดอร์เสมือนใน IIS (คุณสามารถสร้างใหม่ ไดเรกทอรีเสมือนจากที่นั่นใน VS) หากคุณต้องการใช้ไดเรกทอรีเสมือน IIS ที่ "เว็บไซต์" เก่าใช้อยู่คุณจะต้องลบสิ่งนั้นออกจาก IIS ก่อน

  • อัปเดต: เมื่อทดสอบหน้าเว็บของคุณให้จ่ายความสนใจส่วนใหญ่ให้กับชั้นเรียนในโฟลเดอร์ "App_Code" โดยเฉพาะอย่างยิ่งผู้ที่ไม่มี NAMESPACE สิ่งเหล่านี้อาจเป็นกับดักใหญ่ เรามีปัญหากับการโอเวอร์โหลดเมธอดส่วนขยายสองวิธีในคลาสแบบคงที่เดียวกันที่ไม่มีเนมสเปซหนึ่งขยาย DateTime? (Nullable) และเรียกโอเวอร์โหลดอื่นที่ขยาย DateTime เอง การเรียกโอเวอร์โหลดอื่นเป็นวิธีการขยายผ่านการคอมไพล์ VS 2008 และทำให้เรามีข้อผิดพลาดในการคอมไพล์เฉพาะใน RUNTIME (ด้วย IIS) การเปลี่ยนการโทรไปยังการโอเวอร์โหลดอื่นจากการเรียกมันเป็นวิธีการขยายเป็นการเรียกมันเป็นวิธีการแบบคงที่ปกติ (เฉพาะการเปลี่ยนการโทรในคลาสเดียวกันการโทรจากคลาสอื่นยังคงเป็นการเรียกเมธอดส่วนขยาย) ช่วยแก้ปัญหานี้ได้ แต่ชัดเจนว่ามันไม่เป็น ปลอดภัยเหมือนที่เคยเป็นใน VS 2005

  • Update2: ระหว่างการแปลง VS 2008 เปลี่ยนชื่อ "App_Code" ของคุณเป็น "Old_App_Code" ชื่อใหม่นี้ฟังดูน่าเกลียด แต่อย่าเปลี่ยนชื่อใหม่ ในโมเดล "เว็บแอปพลิเคชัน" โค้ดทั้งหมดจะอยู่ในแอสเซมบลีเดียว ในรันไทม์เว็บเซิร์ฟเวอร์ไม่ทราบว่าคุณใช้โครงการเว็บประเภทใด ใช้รหัสทั้งหมดในโฟลเดอร์ "App_Code" และสร้างชุดประกอบใหม่ ด้วยวิธีนี้หากคุณมีโค้ดในโฟลเดอร์ชื่อ "App_Code" คุณจะพบข้อผิดพลาดในการคอมไพล์ RUNTIME ที่ประเภทเดียวกันมีอยู่ในสองแอสเซมบลีประเภทที่สร้างโดย VS และแบบที่สร้างโดยเซิร์ฟเวอร์พัฒนา IIS / ASP.NET . เพื่อหลีกเลี่ยงสิ่งนั้น ปล่อยให้ "Old_App_Code" เป็นชื่อเดียวกันหรือเปลี่ยนชื่อเป็นข้อยกเว้นใด ๆ : "App_Code" อย่าวางโค้ดใด ๆ ใน "App_Code" ดังกล่าว

ฉันรู้เรื่องนี้มาตั้งแต่ก่อน แต่ลืมไปแล้วเพราะฉันไม่ได้ใช้โมเดล "เว็บไซต์" มานาน :(.


2
ลิงก์ของคุณเสียที่ด้านบนข้อผิดพลาด 500
Sameer Alibhai

6
นอกจากนี้ให้มองหาไฟล์โค้ดเพื่อคัดลอกเป็น "เนื้อหา" ไม่ใช่ "คอมไพล์"
jcolebrand

14
สำหรับผู้ที่ทำสิ่งนี้ใน VS2013 "แอบแฝงไปยังเว็บแอป" ถูกย้ายไปที่เมนูโครงการที่ด้านล่าง
Eric Sassaman

3
@EricSassaman แต่ไม่มีเลยสำหรับโครงการ Web Site สำหรับฉัน
NickG

1
@NickG คุณถูกต้องตามบรรทัดแรกของคำตอบไม่มีสำหรับโครงการเว็บไซต์เมนูโครงการจะไม่มีอยู่เว้นแต่คุณจะเลือก Web Application ใน Solution Explorer หากคุณเห็น "เว็บไซต์" บนเมนูแสดงว่าไม่ใช่เว็บแอปพลิเคชัน ทำตามขั้นตอนด้านบนเพื่อสร้าง Web Application เปล่าคัดลอกไฟล์ของคุณลงในนั้น จากนั้น "Convert to Web Application" ควรอยู่ในเมนูโปรเจ็กต์สำหรับ Web Application ใหม่ของคุณ คุณทำเช่นนั้นหรือไม่?
Eric Sassaman

13

Walkthrough: การแปลง Web Site Project เป็น Web Application Project ใน Visual Studioที่ MSDN

หากแอปพลิเคชันเว็บไซต์ของคุณเติบโตขึ้น .. ก็ควรแบ่งออกเป็นหลายโครงการ การแปลงจากโครงการเว็บไซต์เป็นโครงการ Web Application จะไม่ช่วยอะไรมาก


5

หากคุณมีปัญหาในการรับ Web Application Project ใหม่เพื่อสร้างให้ตรวจสอบคุณสมบัติของไฟล์ใน Visual Studio ของคลาส 'ตัวช่วย' ทั้งหมด สำหรับโปรเจ็กต์ฉันกำลังแปลง Build Action ถูกตั้งค่าเป็น Content ในขณะที่ควรเป็น Compile


4

ตอนนี้ฉันได้ย้ายโปรเจ็กต์เว็บไซต์หนึ่งโปรเจ็กต์ไปยังเว็บแอปพลิเคชันเรียบร้อยแล้วและยังมีบางส่วนที่เงียบสงบที่ต้องระวัง

การมี ReSharper พร้อมใช้งานช่วยได้มากในการปรับโครงสร้างไฟล์ aspx

  1. ตั้งค่าโซลูชันของคุณและสร้าง WebApplication ที่ว่างเปล่า
  2. คัดลอกไฟล์ทั้งหมด
  3. ไฟล์ aspx ในโครงการเว็บไซต์ไม่มี Namspace รวมชั้นเรียนของคุณในเนมสเปซที่เหมาะสม
  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. หลังจากที่คุณเตรียมไฟล์ทั้งหมดของคุณแล้ว (อย่าลืมหน้าต้นแบบของคุณ) ให้เรียกใช้ "Convert to web application" หากคุณพบข้อผิดพลาดในภายหลังให้ล้างและทำซ้ำ หากคุณพบข้อผิดพลาดในการจัดเรียง "ไม่พบ TextBoxName แสดงว่าคุณไม่มีข้อมูลอ้างอิง" ตรวจสอบให้แน่ใจว่าคุณไม่ลืมล้างหน้า aspx ของคุณ ตัวบ่งชี้ที่ดีคือการตรวจสอบไฟล์นักออกแบบที่สร้างขึ้นโดยอัตโนมัติ หากTextBoxNameไม่ปรากฏในนั้นแสดงว่าการแปลงไม่สำเร็จอย่างสมบูรณ์

  8. แก้ไขการอ้างอิงที่ขาดหายไป
  9. สร้าง

3

สร้างโปรแกรมประยุกต์บนเว็บใหม่ใน VS 2010
1. การใช้ Windows Explorer คัดลอกไฟล์ทั้งหมดของคุณไปยังโฟลเดอร์โครงการของคุณ
2. ใน VS 2010 solution explorer แสดงไฟล์ทั้งหมด
3. เลือกไฟล์และโฟลเดอร์ - คลิกขวารวมในโปรเจ็กต์
4. คลิกขวาที่ project solution explorer และเลือก Convert to Web Application

มีความแตกต่างเล็กน้อยเช่นโฟลเดอร์ App_Code จะเปลี่ยนชื่อเป็น old_app_code ซึ่งไม่ก่อให้เกิดข้อผิดพลาดใด ๆ TypeName บนแหล่งข้อมูลออบเจ็กต์ของคุณและการสืบทอดบนแท็ก @Page อาจต้องใช้ [ProjectName] คำนำหน้าต่อท้ายทั่วโลก ตัวอย่างเช่นหากชื่อประเภทของคุณคือ "BusinessLogic.OrderManager" และชื่อโครงการของคุณคือ InventorySystem คุณจะต้องเปลี่ยนเป็น InventorySystem.BusinessLogic.OrderManager นอกจากนี้การเปลี่ยนแปลงการแสดงผลบางอย่างเช่นตัวตรวจสอบฟิลด์ที่จำเป็นจะไม่ใช้ค่าเริ่มต้นเป็นแบบอักษรสีแดงอีกต่อไปโดยค่าเริ่มต้นจะเป็นสีดำ


ไฟล์รหัสแอปของฉันไม่เปลี่ยนแปลงอย่างที่คิดไว้ ฉันต้องเปลี่ยนชื่อด้วยตนเองจากนั้นเปลี่ยนหน้า cs ทั้งหมดเพื่อรวบรวม
Mike

3

ฉันประสบปัญหาเดียวกันในตอนแรก หลังจากติดตามหนังสือ Wrox Professional ASP.NET 4.0 ฉันพบวิธีแก้ไขปัญหาต่อไปนี้สำหรับกรณีของฉัน

ก่อนอื่นฉันสร้างเว็บแอปพลิเคชันใหม่ คัดลอกไฟล์เว็บไซต์ทั้งหมดลงในโฟลเดอร์เว็บแอปพลิเคชัน คลิกขวาที่แอปพลิเคชันแล้วคลิกแปลงเป็นเว็บแอปพลิเคชัน

คุณอาจถามว่าทำไมต้องแปลงเว็บแอปเป็นเว็บแอป คำตอบคือเมื่อคุณสร้างเว็บไซต์คุณเพียงแค่เขียนโค้ดไฟล์. c ที่จำเป็น อย่างไรก็ตามเว็บแอปพลิเคชันจะประกาศ .design.cs (หรือ. vb) และไฟล์. cs สำหรับโค้ดและส่วนการออกแบบโดยอัตโนมัติ

ถัดไป: ลบการอ้างอิงด้วยตนเองทั้งหมดเช่นแอตทริบิวต์ "สืบทอด" ในคำสั่ง PAGE ไปยังไฟล์อื่น ๆ ในเว็บไซต์ของคุณเนื่องจากช่องว่างชื่อจะดูแลการอ้างอิงคลาสจากส่วนกลาง

ฉันประสบปัญหาเช่นกันเนื่องจากฉันไม่ได้รวมโฟลเดอร์ OBJ และ BIN ไว้ในโครงการของฉัน หากคุณคิดว่าคุณไม่มีโฟลเดอร์ BIN และ OBJ ของคุณให้คลิกไอคอน 'แสดงไฟล์ทั้งหมด' ใน Solution Explorer จากนั้นคลิกขวาที่โฟลเดอร์ที่หายไปและเพิ่มลงในโครงการ (เพื่อให้แน่ใจว่าคอมไพล์กับโปรเจ็กต์)

UPDATE: ในฐานะที่เป็นจุด @deadlychambers ออกในความคิดเห็นที่: คุณสามารถค้นหาได้ทุกที่ด้วยการทำ "Ctrl + Shift + F" Inherits="(.*?)"แล้วค้นหา สิ่งนี้จะพบเหตุการณ์ทั้งหมดและอาจช่วยคุณประหยัดเวลาได้!


1
คุณสามารถลบทั้งหมดได้ด้วย Ctrl-shift-F จากนั้นเปลี่ยนตัวเลือกการค้นหาสำหรับนิพจน์ทั่วไปและใช้ Inherits = "(. *)?"
DeadlyChambers

1
ตรวจสอบว่าเป็น Inherits = "(. *?)" อีกอันจะจับทุกอย่างที่อยู่เบื้องหลังการสืบทอดจนถึงเครื่องหมายคำพูดสุดท้าย
DeadlyChambers

1
ฉันเพิ่งพบปัญหาที่ไม่มีการสืบทอดทำให้ผู้ออกแบบลบเนมสเปซจากนั้นลบคลาส ฉันหวังว่ามันจะง่ายขึ้น
DeadlyChambers

0

พื้นที่ชื่อ ASP เริ่มต้นดูเหมือนจะไม่ทำงานอีกต่อไป ดังนั้นฉันจึงไม่สามารถเรียกหน้า User Controls.ascx จากภายนอกเพจได้ ให้เนมสเปซแก่พวกเขาและเปลี่ยนค่าเริ่มต้นจาก ASP เป็นเนมสเปซของฉันดูเหมือนจะใช้งานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.