VS2005網站發佈不便問題討論

一、問題引入
在VS2005網站開發過程中,網站發佈問題一直是個問題.VS2005創建的網站有幾個默認的目錄:App_Code,App_Data,App_Themes........
如果是但cs/vb文件,比如UploadFile.cs類UploadFile,這個類文件沒有可視的aspx文件,那麼這個文件就必須放到App_Code目錄下,否則在VS2005網站中,該類是不可訪問的.那麼放就放進去吧,但是編譯的時候(我的VS2005是Team版的,生成沒有反應,感覺象是檢查了一遍代碼,只能使用發佈網站來預編譯.不知道其他版本怎麼樣.)問題來了.選擇發佈網站後,它會讓你選擇以什麼方式發佈,一般選默認就可以了.那樣生成的dll數量還少點.發佈後,在bin目錄一般會有App_Code.compiled,App_Code.dll,App_Web_(隨機字符).dll,引用的dll等文件.問題就出在這了,如果要做個免虛擬的程序,豈不是可能bin目錄會需要放兩個App_Code.dll?會不起衝突麼?還有,如果程序更改一次需要重新發布,那就完了.看看VS2005乾的好事吧.inherits="MyCodeGif, App_Web_vf3ukhnv"本來好好的,一個MyCodeGif.aspx文件,一個MyCodeGif.aspx.cs文件,現在MyCodeGif.aspx文件繼承自MyCodeGif, App_Web_vf3ukhnv,可以看出MyCodeGif是MyCodeGif.aspx.cs定義的類,App_Web_vf3ukhnv是bin文件夾中的一個dll文件名.你再嘗試發佈一次的話,更頭疼的問題來了,怎麼MyCodeGif.aspx頁面又繼承自MyCodeGif, App_Web_qwdwqd了?編譯後的程序集名字都不一樣了!

二、ASP.Net中頁面與類的關係
ASP.Net 中,頁面是可以繼承自類的,可以多重繼承。比如
MyCodeGif.aspx頁面文件
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MyCodeGif.aspx.cs" Inherits="MyCodeGif" %>
MyCodeGif.aspx.cs中是這樣的
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using FreeCodeNum;

public partial class MyCodeGif : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
                  //.....邏輯
    }

}



可見MyCodeGif.aspx頁面繼承自類MyCodeGif 

也可以這樣繼承
MyCodeGif.aspx頁面文件
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MyCodeGif.aspx.cs" Inherits="MyCodeGif" %>

MyCodeGif.aspx.cs中是這樣的
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using FreeCodeNum;

public partial class MyCodeGif PageBase
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
                  //.....邏輯
    }

}

PageBase.cs這樣
using System;
using System.Web;
using System.Collections;

/// <summary>
/// PageBase 的摘要說明
/// </summary>

public class PageBase : System.Web.UI.Page
{
    
public PageBase()
    
{

        }

    }

如過象我MyCodeGif.aspx頁面文件,我甚至可以
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MyCodeGif.aspx.cs" Inherits="PageBase" %>
也就是頁面直接繼承自PageBase類。

結論:ASP.Net的頁面可以繼承自
從     [繼承自System.Web.UI.Page類的父類 ]  擴展的子類

三、解決方案
在VS2005中也是可以自定義程序集名稱的——那就是在創建項目的時候,而不是網站的時候。也就是說可以在你創建的網站已經寫好了,你可以重新創建個項目,然後把網站的代碼拿來重新編譯。便宜完後可能需要更改aspx文件的繼承,可能也不必更改,看你怎麼便宜了,因爲aspx文件的繼承只和類名(有命名空間時,也要指定命名空間)有關。MyCodeGif.aspx頁面文件完全可以改成
<%@ Page Language="C#" AutoEventWireup="true"  Inherits="PageBase" %>

把裏面的CodeFile="MyCodeGif.aspx.cs"去掉。

這樣就能模仿VS2003的方式發佈網站了。過程可能複雜點,但是對於後期維護我感覺還是挺有用的,畢竟習慣了VS2003.而且可以和2003一樣做免虛擬的程序了。

全文完。希望能對大家有用。
作者:謝平,夕陽軌跡            2006-5-27

posted on 2006-05-27 12:35 BirdsHover 閱讀(5054) 評論(14)  編輯 收藏 引用 網摘 所屬分類: ASP.Net2.0

<script type="text/javascript"> // Sys.WebForms.PageRequestManager._initialize('AjaxHolder$scriptmanager1', document.getElementById('Form1')); Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90); // </script>

回覆  更多評論   

# re: 巧用VS2005解決VS2005網站發佈不便問題 2006-06-06 11:21 魔法師

我倒。我就在找。怎麼沒有DLL文件。以爲VS.NET2005不要DLL了嗎
原本是要在發佈的時候纔出現。
不過看了樓主的介紹還是有點雲裏霧裏的。感覺自己要學的東西好多。  回覆  更多評論   

# re: 巧用VS2005解決VS2005網站發佈不便問題 2006-06-09 18:48 一滴水

@謝平
這樣使用 partial 把像Button這樣的是在也面上聲明的,後面類就直接使用前臺aspx的頁面,在使用類庫形式編譯的,這樣就會造成cs頁面就沒有造成編譯通同過,不知道樓上怎麼解決的?  回覆  更多評論   

# re: 巧用VS2005解決VS2005網站發佈不便問題 2006-06-20 23:00 @VS

VS2005濫透了.  回覆  更多評論   

# re: 巧用VS2005解決VS2005網站發佈不便問題 2006-06-20 23:05 @VS

VS2005濫透了,維護網站除了重新生成新的DLL文件外(原來舊的DLL文件並沒有被覆蓋),還得在幾十個文件夾裏面一個個地將aspx文件覆蓋掉.  回覆  更多評論   

# re: 巧用VS2005解決VS2005網站發佈不便問題 2006-06-24 15:37 北極熊,我來了!

用了這樣的方式之後,好象對於botton就沒用了,程序會出現錯誤,不知道是什麼原因?  回覆  更多評論   

# re: 巧用VS2005解決VS2005網站發佈不便問題 2006-06-28 17:55 謝平

@北極熊,我來了!
@一滴水

ASPX文件源代碼的發佈確實存在很大問題,可以考慮不使用繼承,而直接引用
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

裏的 CodeFile="Default.aspx.cs" Inherits="_Default" 直接去掉,綁定部分代碼直接在頁面給出。對於邏輯層的東西,可以引入DLL的命名空間解決。

我暫時只想到這個解決辦法。


我的這篇文章主要是解決App_Code目錄生成固定程序集名稱的問題。解決免虛擬的問題  回覆  更多評論   

# re: 巧用VS2005解決VS2005網站發佈不便問題 2006-06-28 23:04 阿不

我想不是Vs 2005濫吧?應該是我們還沒有適應這種模式的開發而已,Microsoft推出這種模式可以說是一種嘗試,但是到目前爲止,我認爲這種模式並不能讓大多數人接受,(至少是國內)。所以在Vs 2005推出不久就又推出Web Application Project模式,類似於Vs2003的項目文件管理整個項目的方式。不過我還是覺得它與VS2003有很大的差別,至少融合Web site的一些優點,(比如不需要與IIS的映射等)。目前基本就用它了。

回到本文的主題,關於Web Site的部署問題,不知道大家有沒有發現,在項目工程點右鍵可以看到一個菜單"Publish Web Site",可以用它來發布站點,其中有一些選項可能是你需要的,比較強名稱,將所以的頁面代碼編譯成一個Assembly等等。
先到這,歡迎交流。  回覆  更多評論   

# re: 巧用VS2005解決VS2005網站發佈不便問題 2006-07-10 12:49 microsystem

有沒有方法直接把web site 轉換成 web app ,
web site 一個頁面只有兩個文件,web app 就有三個了!

強名稱是不是就可以將所以的頁面代碼編譯成一個Assembly??

還有一個問題就是:

用 web app 中 vb 默認系統生成的vb 文件類名,和 C# 生成的不一樣
C# 會根據目錄結構定義命名空間, VB 沒有!

C# onclick 等事件是在aspx頁面上定義 ,不能像VB 一樣在VB 文件定義!

對於以上兩個問題 ,還有解決方法?
  回覆  更多評論   

# re: 巧用VS2005解決VS2005網站發佈不便問題 2006-07-12 13:07 謝平

@microsystem
web site有些部分是不能轉成web app的,只能部分轉

編譯成一個DLL通過WebDeployment工具也能做到

命名空間可以自己加

C# onclick 等事件是在aspx頁面上定義,也可以和1.1一樣自己添加類似下面
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
這種  回覆  更多評論   

# re: 巧用VS2005解決VS2005網站發佈不便問題 2006-09-07 10:38 hihi


vs2005自帶的發佈功能不是挺好?  回覆  更多評論   

# re: 巧用VS2005解決VS2005網站發佈不便問題 2006-09-08 08:57 謝平

@hihi
vs2005帶了兩種發佈功能,這裏討論的是編譯的方式運行,當然,源碼方式運行不存在這問題。  回覆  更多評論   

# re: 巧用VS2005解決VS2005網站發佈不便問題 2006-09-15 03:54 路過

WebDeployment用這個插件吧。或者使用英文版本的可以下載另一個插件。象vs2003建立web app 而不是 web site.中文版本好象現在不支持  回覆  更多評論   

# re: 巧用VS2005解決VS2005網站發佈不便問題 2006-12-14 22:58 Jason Cui

樓主的發佈方式似乎有問題,反正我用Pro版沒有遇到過問題,編譯網站就是把所有代碼編譯一遍,可以用來檢查錯誤,發佈網站就是生成一個乾淨的目錄,編譯出所有的dll文件。dll的名字並不重要,這個並不是你應該關心的。在源aspx文件中已經指明瞭它的後臺代碼文件,這裏並不是使用繼承實現的,而是用partial類,所以生成的dll文件叫什麼都無所謂,只要被加載,它裏面的類名就可以被找到。 

# re: 巧用VS2005解決VS2005網站發佈不便問題 2006-05-27 19:45 lonfone
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章