ASP.NET web sitesini ASP.NET web uygulamasına dönüştürme


90

Bir ASP.NET 3.5 Web Sitem var (visual studio lingo), ancak site büyümeye devam ediyor ve diğer şeylerin yanı sıra oldukça kovboy gibi görünüyor. Bunun bir Web Uygulamasına (ad alanları ve tümü) dönüştürüldüğünü görmek istiyorum.

Bu, Visual Studio'da kolayca yapılabilen bir şey mi? Değilse, tüm ad alanlarını vb. Otomatik olarak yaratabilecek başka araçlar var mı?


4
Bu web sitesi şablonu, Web Uygulaması şablonuna kıyasla gerçekten korkunç bir POS. Web sitesi şablonunu kullanmanın herhangi bir faydasını göremiyorum ...
James

9
@James - ondan uzaklaşmak istediğim birçok nedenden sadece biri ...
Koroya

2
Aşağıdaki izlenecek yolun çok kapsamlı olduğundan eminim (hepsini okumadım), ancak youtube'daki bir kişi burada bir web sitesini bir web uygulamasına dönüştürmenin çok basit bir yolunu gösterdi: youtube.com/watch?v=oXptokM0v7w - as her zamanki bunun herkes için işe yarayacağını garanti edemem. Bu yöntemin daha az karmaşık sitelere sahip kişiler için işe yarayacağını düşünüyorum.
dyslexicanaboko

3
VS2013 kullanıyorsanız , menü öğesinin taşındığını unutmayın .
Jon

Yanıtlar:


108

Görünüşe göre "web uygulamasına dönüştür" seçeneği "web siteleri" için mevcut DEĞİL. "Web uygulamasına dönüştür" seçeneği yalnızca "web uygulamaları" için mevcuttur !!!!

[vurgu benim]

İşte anlaşma, dönüşümü yapmak için yapmanız gerekenler:

  • VS 2008 çözümünüze yeni bir "Web Uygulaması" ekleyin (Dosya-> Ekle-> Yeni Proje-> C # -> Web-> ASP.NET Web Uygulaması).

  • Daha sonra, eski "web sitesindeki" tüm dosyaları yeni oluşturduğunuz "web uygulamanıza" kopyalarsınız ve varsayılan olarak içinde oluşturulan dosyaları geçersiz kılarsınız.

  • Bir sonraki adım en çirkin olanıdır, "web sitenizdeki" referansları yeni "web uygulamasına" "manuel olarak" eklemeniz gerekir. VS 2008 PowerCommands oyuncağının diğer proje türlerinden referansları kopyaladığı için bunu benim için yapacağını düşündüm, ancak yapmadı. Bunu kendiniz, elle yapmanız gerekir ve aynı derlemenin birden çok sürümüne (benim durumumda AJAXToolkit gibi) veya hem GAC hem de yerel sürümlere sahip derlemelere sahipseniz bu adımda dikkatli olmalısınız.

  • Son adımı tekrar etmeye ve "web uygulamasını" oluşturmaya çalışın. "'....' bilinmeyen ad alanı gibi hatalar almaya devam edeceksiniz. Bir derleme başvurusu eksik mi?". Kullandığınız sunucu denetimlerinin kimlikleriyle '....' değiştirilenler dışında bunlardan hiçbirine sahip olmadığınızdan emin olun. Başka bir deyişle, yalnızca .DESIGNER.CS veya .DESIGNER.VB dosyalarının eksik olması nedeniyle var olan hatalara kadar referans eklemeye ve projeyi oluşturmaya devam edin.

  • Daha sonra, VS 2008 çözüm gezgininde "web uygulaması" kök proje düğümüne gidin ve sağ tıklayın, ardından "Web uygulamasına dönüştür" seçeneğini bulacaksınız. Bu seçeneğin yaptığı şey aslında sayfaların ve denetimlerin "@Page" ve "@Control" yönergelerinde küçük değişiklikler yapmak ve gerekli .DESIGNER.CS veya .DESIGNER.VB dosyalarını oluşturmaktır.

  • "Web uygulamasını" yeniden oluşturmayı deneyin. Hata alırsanız, hangi referansların eksik olabileceğini görün ve / veya tekrar "Web uygulamasına dönüştür" düğmesini tıklayın. Bazen, eksik DESIGNER dosyalarından başka bir hata varsa, tüm sayfalar / kontroller bu DESIGNER dosyalarına sahip olmayacaktır. Bunun için DESIGNER olmayan sorunun giderilmesi ve tekrar "web uygulamasına dönüştür" seçeneğine tıklanması işi yapmalıdır.

  • Başarılı VS kurulumunu tamamladığınızda, gitmeye hazır olmalısınız. Web uygulamanızı test etmeye başlayın. İsteğe bağlı olarak, VS 2008 Solution Explorer'da "web uygulaması" kök proje düğümüne sağ tıklayıp "Özellikler" e tıklayıp "web uygulamasını" IIS'de sanal bir klasöre ayarlamak için "Web" sekmesine gidebilirsiniz (yeni oradan VS'de sanal dizin). Eski "web sitesinin" kullandığı IIS sanal dizinini kullanmak istiyorsanız, bunu önce IIS'den kaldırmanız gerekir.

  • Güncelleme: Sayfalarınızı test ederken, "App_Code" klasöründeki sınıflara, özellikle de NAMESPACE içermeyenlere EN ÇOK DİKKAT gösterin. Bunlar büyük bir tuzak olabilir. Ad alanı olmayan aynı statik sınıfta iki uzantı yöntemi aşırı yüklemesiyle ilgili bir sorun yaşadık, biri DateTime? (Nullable) ve DateTime'ın kendisini genişleten başka bir aşırı yüklemeyi çağırır. Uzantı yöntemi olarak diğer aşırı yüklemeyi çağırmak VS 2008 derlemesini geçti ve bize YALNIZCA ÇALIŞMA SÜRESİNDE (IIS ile) bir derleme hatası verdi. Çağrıyı, uzantı yöntemi olarak çağırmaktan onu normal statik yöntem olarak çağırmaya değiştirmek (yalnızca aynı sınıftaki çağrıyı değiştirmek, uzantı yöntemi çağrıları olarak kaldı) bunu çözdü, ancak açık bir şekilde değil VS 2005'te olduğu gibi güvenli.

  • Güncelleme2: Dönüştürme sırasında, VS 2008 "App_Code" unuzu "Old_App_Code" olarak yeniden adlandırır. Bu yeni ad kulağa çirkin geliyor, ancak YENİDEN ADLANDIRMAYIN. "Web uygulaması" modelinde, tüm kod tek bir derlemede olacaktır. Çalışma zamanında, web sunucusu hangi web projesi türünü kullandığınızı bilmez. "App_Code" klasöründeki tüm kodu alır ve bunun için yeni bir montaj oluşturur. Bu şekilde, "App_Code" adlı klasörde kodunuz varsa, VS tarafından oluşturulan ve IIS / ASP.NET Geliştirme Sunucusu tarafından oluşturulan iki derlemede aynı türlerin mevcut olduğu RUNTIME derleme hatalarıyla sonuçlanırsınız. . Bundan kaçınmak için. "Eski_Uygulama_Kodu" nu aynı adla bırakın veya HERHANGİ BİR HARİÇ: "Uygulama_Kodu" olarak yeniden adlandırın. Böyle bir "Uygulama_Kodu" na herhangi bir kod yerleştirmeyin

Bunu daha önce de biliyorum ama "web sitesi" modelini uzun süredir kullanmadığım için şimdi unuttum :(.


2
Bağlantınız üstte bozuk, Hata 500
Sameer Alibhai

6
Ayrıca, "derlemek" yerine "içerik" olarak kopyalanacak kod dosyalarını arayın
jcolebrand

14
Bunu VS2013'te yapanlarınız için, "Web Uygulamasına Dönüştür", alttaki Proje menüsüne taşındı.
Eric Sassaman

3
@EricSassaman Ama benim için Web Sitesi projeleri için hiç orada değil.
NickG

1
@NickG, haklısınız, cevabın ilk satırına göre, web sitesi projeleri için orada DEĞİLDİR, Çözüm Gezgini'nde bir Web Uygulaması seçmediğiniz sürece Proje menüsü bile mevcut değildir. Menüde "Web Sitesi" görürseniz, bu bir Web Uygulaması değildir. Boş bir Web Uygulaması oluşturmak için yukarıdaki adımları izleyin, dosyalarınızı içine kopyalayın. Ardından, yeni Web Uygulamanız için proje menüsünde "Web Uygulamasına Dönüştür" olmalıdır. Onu yaptınmı?
Eric Sassaman


5

Yeni Web Uygulaması Projenizi oluştururken sorun yaşıyorsanız, tüm 'yardımcı' sınıfların Visual Studio'daki Dosya Özelliklerini kontrol edin. Bir proje için, Oluşturma Eylemini İçerik olarak ayarlıyordum, oysa Derleme olmalıydı.


4

Şimdi bir Web sitesi projesini bir web uygulamasına başarıyla taşıdım ve dikkat edilmesi gereken birkaç sorun var.

ReSharper'ın emrinizde olması aspx dosyalarını yeniden düzenlemede çok yardımcı olur.

  1. Çözümünüzü kurun ve boş bir WebApplication oluşturun
  2. Tüm dosyayı kopyala
  3. Web sitesi projelerindeki aspx dosyalarının ad alanı yoktur. Sınıflarınızı uygun ad alanlarına sarın
  4. Kopyalama sırasında, alt klasörlerdeki tüm sayfalarım proje adıma ve klasör adına yeniden adlandırıldı, bu nedenle public partial class FolderName_Projectname : Pagetüm dosyaları Resharper kullanarak veya manuel olarak yeniden adlandırmak için 40ish'i aldım . Gibi birden çok hatayla karşılaşırsanız "There is already a member Page_Load() defined", bunun nedeni büyük olasılıkla yanlış sınıf adları ve yinelemedir.
  5. Bir ad alanı ekledikten sonra
  6. CodeFileTüm aspx sayfalarını Codebehindalt klasörünüzdeki dosyalarla değiştirin ve özellikle bunlara dikkat edin. Inhertis=""Göreli yolu içermediğinden emin olun . Ad alanlarınız her şeyi halleder. Yani doğru format Inherits="Namespace.classname". Sınıfınızda bir NaSpa ad alanı ve foo.cs dosya adı varsa,Inherits="NaSpa.foo"

  7. Tüm dosyalarınızı hazırladıktan sonra (ana sayfalarınızı unutmayın), "Web uygulamasına dönüştür" komutunu çalıştırın. Daha sonra hatalarla karşılaşırsanız durulayın ve tekrarlayın. "TextBoxName bulunamıyor, referans eksik mi" türünde hatalarla karşılaşırsanız, aspx sayfalarınızı temizlemeyi unutmadığınızdan emin olun. Otomatik olarak oluşturulan tasarımcı dosyalarını kontrol etmek iyi bir göstergedir. Eğer TextBoxNameorada görünmüyorsa, dönüşüm tamamen başarılı olamadı.

  8. Eksik bağımlılıkları giderin.
  9. İnşa etmek

3

VS 2010'da Yeni Bir Web Uygulaması Oluşturun.
1. Windows Gezgini'ni kullanarak tüm dosyalarınızı proje klasörünüze kopyalayın.
2. VS 2010 çözüm gezgininde tüm dosyaları gösterin.
3. Dosyaları ve klasörleri seçin - projeye dahil et'e sağ tıklayın.
4. Proje çözüm gezginine sağ tıklayın ve Web Uygulamasına Dönüştür'ü seçin.

App_Code klasörünün old_app_code olarak yeniden adlandırılması gibi oldukça küçük farklar vardır - bu şaşırtıcı bir şekilde herhangi bir hataya neden olmaz. Nesne veri kaynaklarınızdaki TypeName ve @Page etiketindeki devralmalar, [ProjeAdı] 'na ihtiyaç duyabilir. önek genel olarak eklendi. Örneğin, tür adınız "BusinessLogic.OrderManager" ve proje adınız InventorySystem ise, bunu InventorySystem.BusinessLogic.OrderManager olarak değiştirmeniz gerekir. Ayrıca, zorunlu alan doğrulayıcılarının artık varsayılan olarak kırmızı yazı tipini kullanmaması, varsayılan olarak siyah olarak ayarlanması gibi birkaç ekran değişikliği.


uygulama kod dosyam olması gerektiği gibi değişmedi. Manuel olarak yeniden adlandırmam ve ardından derlemek için tüm cs sayfalarını değiştirmem gerekiyordu.
Mike

3

Başlangıçta aynı sorunlarla karşılaşıyordum. Wrox Professional ASP.NET 4.0 kitabını takip ettikten sonra, durumum için aşağıdaki çözümü buldum.

Önce yeni bir web uygulaması oluşturdum. Tüm web sitesi dosyalarını web uygulaması klasörüne kopyaladı. Uygulamaya sağ tıklayın ve web uygulamasına dönüştür seçeneğine tıklayın.

Bir web uygulamasını neden bir web uygulamasına dönüştürmeniz gerektiğini sorabilirsiniz. Cevap, bir web sitesi oluşturduğunuzda, gereken her yerde .cs dosyasını kodlamanızdır. Ancak bir web uygulaması, kod ve tasarım bölümü için otomatik olarak .design.cs (veya .vb) ve bir .cs dosyası bildirir.

SONRAKİ: Web sitenizdeki diğer dosyalara PAGE direktifindeki 'Devralır' özniteliği gibi tüm manuel referansları kaldırın, çünkü ad boşlukları sınıflara merkezi olarak atıf yapacaktır.

Ayrıca projeme OBJ ve BIN klasörünü dahil etmediğim için bir sorunla karşılaştım. BIN ve OBJ klasörlerinizin eksik olduğunu düşünüyorsanız, Çözüm Gezgini'nde 'Tüm Dosyaları Göster' simgesine tıklayın ve ardından eksik klasörlere sağ tıklayıp projeye ekleyin. (proje ile derlendiklerinden emin olmak için.)

GÜNCELLEME: @deadlychambers'ın yorumlarda belirttiği gibi: "Ctrl + Shift + F" yaparak her yerde arama yapabilir ve ardından aratabilirsiniz Inherits="(.*?)". Bu, tüm olayları bulacak ve muhtemelen size biraz zaman kazandıracak!


1
Hepsini Ctrl-shift-F ile kaldırabilir ve ardından normal ifade için arama seçeneklerini değiştirebilir ve bu Inherits = "(. *)?"
DeadlyChambers

1
Inherits = "(. *?)" Olup olmadığını kontrol edin, diğeri mirasın arkasındaki her şeyi son tırnak işaretine kadar alacak.
DeadlyChambers

1
Kalıtımların OLMAMASININ tasarımcının ad alanını ve ardından sınıfı silmesine neden olduğu bir sorunla karşılaştım. Keşke daha kolay olsaydı.
DeadlyChambers

0

varsayılan ASP ad alanı artık çalışmıyor gibi görünüyor. Bu yüzden Kullanıcı Controls.ascx sayfalarımı sayfanın dışından arayamıyorum. Onlara bir ad alanı vermek ve varsayılanı ASP'den benim ad alanıma değiştirmek işe yaradı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.