2015年9月27日 星期日

TextBox輸入文字自動完成(非WebService和使用WebService寫法整理)

如果想在TextBox上輸入文字,即時出現一個Layer文字列表,類似Google搜尋那樣
一般的做法是使用WebService吧
1.先看WebService
以個人測試Web site範例,我是開一個WebService資料夾在根目錄下,然後加入一個WebService.asmx
同時Visual Studio也會產生一份WebService.cs檔在App_Code資料夾內
WebService.cs內的程式碼:
using System.Collections;
using System.Data;
using System.Data.SqlClient;


[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {

    [System.Web.Services.WebMethodAttribute(), System.Web.Script.Services.ScriptMethodAttribute()]
    //方法不可宣告static
    public string[] GetCompletionList(string prefixText, int count)
    {
        //資料庫連線字串
        string connStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename="
                     + System.Web.HttpContext.Current.Server.MapPath("~/App_Data/NorthwindChinese.mdf") + ";Integrated Security=True;User Instance=True";

        ArrayList array = new ArrayList();//儲存撈出來的字串集合

        using (SqlConnection conn = new SqlConnection(connStr))
        {
            DataSet ds = new DataSet();
            string selectStr = @"SELECT Top (" + count + ") CompanyName FROM Customers Where CompanyName Like '" + prefixText + "%' Order by CustomerID ASC";
            SqlDataAdapter da = new SqlDataAdapter(selectStr, conn);
            conn.Open();
            da.Fill(ds);
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                array.Add(dr["CompanyName"].ToString());
            }

        }

        return (string[])array.ToArray(typeof(string));

    } 

    
}
接著新增一個UseWebService.aspx檔案在根目錄
aspx程式碼
<%@ Page Language="C#" AutoEventWireup="true"  %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>

<html>
<head >
</head>
<body>
    <form id="form1" runat="server">

    <asp:ScriptManager ID="ScriptManager1" runat="server" />

    <asp:TextBox ID="TextBox1" runat="server" />

    <asp:AutoCompleteExtender
           ID="AutoCompleteExtender1"
           runat="server"
           MinimumPrefixLength="1"
           TargetControlID="TextBox1"
           ServiceMethod="GetCompletionList"
           ServicePath="WebService/WebService.asmx"
           CompletionSetCount="15" 
    />
    <!--AutoCompleteExtender成員說明
    MinimumPrefixLength:最少輸入幾個字就呼叫Method
    TargetControlID:哪個TextBox要有自動完成功能
    ServiceMethod:呼叫的Method名
    ServicePath:WebService路徑
    CompletionSetCount:要列出幾筆資料
    -->
    </form>
</body>
</html>
結束,因為Code-Behind沒有要寫程式,所以我把UseWebService.aspx.cs宰了

2.接著再看不使用WebService的做法
先在App_Code裡新增一個AutoComplete_WebPage.cs類別
AutoComplete_WebPage.cs的程式碼
using System.Data;
using System.Data.SqlClient;
using System.Collections;

//類別繼承System.Web.UI.Page目的是為了讓其他aspx.cs可以再繼承下來使用
public class AutoComplete_WebPage :System.Web.UI.Page
{
    [System.Web.Services.WebMethodAttribute(), System.Web.Script.Services.ScriptMethodAttribute()]
    //一定要宣告成static才有效果
    public static string[] GetCompletionList(string prefixText, int count)
    {
        //連線字串
        string connStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename="
                     + System.Web.HttpContext.Current.Server.MapPath("~/App_Data/NorthwindChinese.mdf") + ";Integrated Security=True;User Instance=True";

        ArrayList array = new ArrayList();//儲存撈出來的字串集合

        using (SqlConnection conn = new SqlConnection(connStr))
        {
            DataSet ds = new DataSet();
            string selectStr = @"SELECT Top (" + count + ") CompanyName FROM Customers Where CompanyName Like '" + prefixText + "%' Order by CustomerID ASC";
            SqlDataAdapter da = new SqlDataAdapter(selectStr, conn);
            conn.Open();
            da.Fill(ds);
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                array.Add(dr["CompanyName"].ToString());
            }

        }

        return (string[])array.ToArray(typeof(string));

    } 

}
接著在網站根目錄下新增一個NoWebService.aspx
NoWebService.aspx程式碼
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="NoWebService.aspx.cs" Inherits="NoWebService" %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>

<html>
<head runat="server">
</head>
<body>
    <form id="form1" runat="server">

    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <asp:TextBox ID="TextBox1" runat="server" />

    <asp:AutoCompleteExtender
           ID="AutoCompleteExtender1"
           runat="server"
           TargetControlID="TextBox1"
           MinimumPrefixLength="1"
           ServiceMethod="GetCompletionList"
           CompletionSetCount="15" 
    />




    </form>
</body>
</html>
NoWebService.aspx.cs程式碼
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

//繼承AutoComplete_WebPage類別
public partial class NoWebService : AutoComplete_WebPage
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
}

3.最後分別把UseWebService.aspx或NoWebService.aspx執行起來,效果一樣
(註:Firefox 更新到4.x版以上可以支援ASP.net Ajax的自動完成)
整理一下兩者寫法差異

 新增項目App_Code/cs檔類別App_Code/cs檔方法網頁程式
使用WebServiceWebService.asmx、WebService.cs檔類別加[System.Web.Script.Services.ScriptService]屬性,
並繼承System.Web.Services.WebService
方法不可宣告static否則無效aspx頁面的AutoCompleteExtender擴充項
須指定ServicePath
不使用WebService加入一個類別AutoComplete_WebPage.cs類別繼承System.Web.UI.Page一定要宣告成static才有效果aspx.cs須繼承自訂類別
不使用WebService做法的原理:
每支aspx程式要有自己的public static Method(服務方法),若寫在MasterPage或WebUserControl的話,ServiceMethod會抓不到,所以只好用繼承的方式,讓有需要做自動完成功能的aspx程式繼承自訂類別,而該自訂類別就是實現自動完成功能的System.Web.UI.Page子類別

2011/9/2 眼尖的讀者可以發現以上的SQL查詢會有SQL Injection危險,所以以上 SqlDataAdapter 的查詢語法最好改成以下:
string selectStr = @"SELECT Top (" + count + ") CompanyName FROM Customers Where CompanyName Like  @prefixText + '%' Order by CustomerID ASC";
SqlDataAdapter da = new SqlDataAdapter(selectStr, conn);
da.SelectCommand.Parameters.AddWithValue("@prefixText", prefixText);
再附上黑暗執行緒網友的jQuery AutoComplete懶人包文章
2011/10/19 追加說明
如果是在MasterPage或是WebControl做自動完成的話,建議採用WebService的方式,才能成功。

2015年9月26日 星期六

Google Drive 雲端硬碟應用,在 Google Drive 也能建立 HTML 網頁直接瀏覽

在去年阿湯曾經介紹過在 Dropbox 上可以建立 HTML 的網頁供別人瀏覽,那麼有人應該會跟我一樣好奇,「Google Drive 雲端硬碟」能不能也做到相同的功能,研究了一下,答案是可以的,而且很簡單,這對於常要 Demo 網頁給別人看或是其它相關需求來說相當便利,再搭配 GDrive 的電腦端軟體,就可以直接在電腦上進行編輯,即時同步上傳觀看結果,也可以應用在和朋友之間共享同一資料夾,互相編輯 HTML 內容,一起討論,更多應用就看你想怎麼做囉。

如何在 Google Drive 建立 HTML 網頁?

先在要放入 HTML 網頁檔案的資料夾開啟共用。
01
共用時變更一下檢視權限。
02
選擇「公開在網路上」。
03
然後記下上方的共用連結後,按下完成。
04
上傳你要放置的網頁檔案上去,主頁記得要用 index.html。
05
然後看一下剛剛取得的共用連結,比如我剛剛的是
請去頭去尾,留下那串「0B75wDHn7xvXieU4zUDZpNzJUU0E」,然後改成這樣

應該看的懂,只要在那串前面加上「https://googledrive.com/host/」即可,再貼到瀏覽器就可以瀏覽囉,上面那串也是 Demo 網址,大家可以看看,如果嫌網址太長可以配合短網址使用。

2015年9月23日 星期三

Visual Studio 及 ASP.NET 的 Web 應用程式專案部署概觀

本主題提供需要發行工作的概觀 (Visual Studio) 部署 Web 應用程式專案加入至其他伺服器可以存取在網際網路上的應用程式。
這個主題適用於下列產品:
此主題包括下列章節:
列出的部分工作這裡只適用於 Web 應用程式專案。 如需如何部署網站專案的詳細資訊,請參閱 Visual Studio 及 ASP.NET 的 Web 部署內容對應

使用單鍵發行或 部署套件,您可以部署 Web 應用程式專案:
  • 單鍵發行參考可讓您直接從 Visual Studio IDE 部署可以按一下按鈕在 Visual Studio 的功能。 Visual Studio 連接至目的伺服器,複製到專案檔,以及執行其他部署工作。
  • Web 部署套件是一種包含部署所需的所有資訊的 .zip 檔。 您建立套件從命令列或在 Visual Studio 中,您可以使用命令列或 IIS 管理員,然後,請將其安裝至目的伺服器。
您可以使用哪些方法取決於您的案例和您的個人偏好。 按一下發行功能通常不會實作連續整合 (CI) 開發程序的小型組織的最佳選擇。 您通常會部署到執行應用程式的共用裝載環境中的每一個專屬伺服器的裝載服務公司。 (共用裝載環境中,單一伺服器用來裝載多個裝載服務公司用戶端的網站)。
典型協力廠商裝載部署案例
在企業環境中,通常會部署至您的公司的伺服器上,依序連接至網際網路,因此,您通常會實作一個處理序 CI。 在實際執行之前,會將應用程式部署可以測試和開發用環境升級。 在這些案例中可以使用單鍵發行來部署至測試環境,但是,以進行傳遞至會產生不同的環境中,部署套件通常會使用。因為它們可以整合至 CI 處理序使用命令列建立和安裝套件,部署套件提供企業案例是適當的。
企業 Web 部署的典型案例
在裝載在 Cloud 中的 Web 應用程式時, Windows Azure就會使用協力廠商裝載和企業案例也適用。 在 Windows Azure,您的應用程式可在共用裝載環境中或是專屬的虛擬機器。

這必須執行才能部署至協力廠商裝載服務公司的基本工作:
  1. 設定與裝載服務公司所提供的帳戶。
    如需支援從 Visual Studio 的自動化部署裝載提供者的詳細資訊, ASP.NET 裝載請參閱 請確定您選擇支援 ASP.NET 版本的 Web 專案所使用的提供者。
  2. 建立發行設定檔。
    發行設定檔為登錄指定您要部署至的伺服器,認證給伺服器,資料庫部署和其他選項。 裝載服務公司傳送您針對發行設定檔所需的設定,在電子郵件訊息或才能匯入至 Visual Studio 中開啟該檔案。
  3. 藉由按一下單鍵發行按鈕開始部署程序。
    [發佈] 按鈕在您使用建立發行設定檔的 [發行 Web] 精靈。 也可以在您可以從 Visual Studio 的 [檢視]–[工具列] 功能表選項的 [網路上按一下發行] 工具列。
如需使用這個處理序的一般說明,請參閱 HOW TO:在 Visual Studio 中使用按一下發行來部署 Web 應用程式專案 如需透過部署的端對端案例引導您從 Visual Studio 12 部分的教學課程,請 至裝載提供者的部署 參閱 ASP.NET 網站。
注意事項 注意事項
根據預設, Visual Studio 2012 建立目標為 ASP.NET 4.5 的 Web 專案。 若要部署 ASP.NET 4.5 專案對不支援 ASP.NET 4.5 的裝載服務提供者,應用程式將無法執行。 若要解決這個錯誤,您必須刪除在伺服器上部署的所有應用程式檔案。 如需詳細資訊, 至裝載提供者的部署:疑難排解請參閱
如需企業部署案例,請參閱 部署於企業案例的 Web 應用程式 ASP.NET 網站上的教學課程系列。 企業部署的教學課程。 Visual Studio 2010 寫入和未針對 Visual Studio 2012更新。

Visual Studio 提供自動化的資料庫部署三種方法:
這三個方法,當您選取 Web 部署發行方法時,才可以使用。 如果您使用不同發行方法,例如 FTP,檔案系統,或 FPSE,您必須處理資料庫部署在 Visual Studio 以外。 請參閱下列資源。如需如何手動部署 SQL Server 資料庫的資訊:

Dd394698.collapse_all(zh-tw,VS.110).gifEntity Framework Code First 移轉

在 Entity Framework 第 4.3 版中, Microsoft 引入 程式碼第一移轉。 程式碼會先移轉 Automation 對資料模型中加入和變更傳播至資料庫之變更的程序。 在第一次程式碼舊版,每次變更資料模型,,您通常會讓 Entity Framework 卸除並重新建立資料庫。 這並不是一個問題在開發中,因為測試資料輕鬆地重建,但在實際執行環境中,您通常要更新資料庫結構描述,而不用卸除資料庫。 移轉功能會先讓程式碼來更新資料庫,而不需捨棄並重新建立它。 您可以先讓程式碼自動決定如何進行必要的結構描述變更,也可以撰寫自訂變更的程式碼。 如需程式碼的展示第一移轉, 程式碼會先移轉請參閱
Visual Studio 可以自動部署由程式碼第一移轉處理資料庫的處理序。 當您設定發行設定檔時,請選取標記為 [執行程式碼的第一個移轉 (應用程式開始執行)] 的核取方塊:
Publish_Web_Settings_tab_with_cf_database_high
使用 Entity Framework 程式碼中的第一個內容類別,這個核取方塊為資料庫會顯示應用程式存取。 當您選取這個選項時,部署程序會自動為您設定目的伺服器上的應用程式 Web.config 檔案中,讓程式碼會先使用 MigrateDatabaseToLatestVersion 初始設定式類別。 下圖顯示的範例這個設定會看起來像是在 Web.config 檔中:
Web.config 中的 MigrateDatabaseToLatestVersion
[執行程式碼的第一個移轉] 選取目的 Web.config 檔案可能會導致部署流程放置額外的連接字串:
Web.config 中的 DatabasePublish 連接字串
使程式碼進行資料庫結構描述變更會先使用這個額外的連接字串。 這個連接字串必須指定存取資料庫的系統管理權限的使用者認證。 由於程式碼提供結構描述更新先使用不同的連接字串,您可以指定限制在應用程式連接字串之使用權限的使用者認證。 如需詳細資訊, 檢閱程式碼第一移轉的自動變更 Web.config 請參閱 ASP.NET 網站。
Visual Studio 不會在部署期間執行的動作與資料庫連接。 當部署的應用程式在部署之後第一次存取資料庫,程式碼會自動先建立資料庫或更新資料庫結構描述對應至最新的版本。 如果應用程式執行移轉 Seed 方法,執行方法時,在資料庫中建立或更新結構描述。
如需如何設定 Visual Studio 中的程式碼會先移轉部署的詳細資訊,請參閱 HOW TO:在 Visual Studio 中使用按一下發行來部署 Web 應用程式專案和本教學課程系列 部署至使用 Visual Studio 或 Visual Web Developer 中裝載提供者的 ASP.NET Web 應用程式

Dd394698.collapse_all(zh-tw,VS.110).gifdbDacFx Web 部署提供者

若要為資料庫部署使用 dbDacFx Web 部署提供者,請選取標記為在 [發行 Web] 精靈的 [更新資料庫] 的核取方塊。 這個核取方塊為 SQL Server 資料庫會顯示未使用 Entity Framework 程式碼中的第一個內容類別的應用程式存取:
Publish_Web_Settings_tab_with_non_cf_database_
在初始部署期間, dbDacFx 提供者建立資料表和其他資料庫物件在目的資料庫中符合來源資料庫。 在後續部署,提供者會判斷不同於來源和目的資料庫之間,,並且更新目標資料庫的結構描述符合來源資料庫。 根據預設,提供者不會造成資料遺失的變更,例如,在資料表或資料行已刪除。
這個選項可以讓您指定在部署中,您將會在目的資料庫中要執行的自訂 SQL 指令碼。 例如,在這種情況下,提供者會建立資料表之後,您可以執行自訂指令碼才能插入初始資料至資料表。 或者您可以執行自訂指令碼會定義無法自動完成的結構描述變更,因為這會造成資料遺失。
這個資料庫部署方法需要 Web Deploy 3.0 和 dbDacFx 提供者在目的 Web 伺服器上安裝。 (這些檔案會在目的資料庫伺服器不需要安裝)。
dbDacFx 提供者不適用於 Windows Vista SP2 與作業系統一起使用,例如 Windows XP 和 Windows Server 2003。 如需在這些作業系統上的資料庫部署,請使用 dbFullSql Web 部署提供者
您可以使用 dbDacFx 提供者,如需如何部署資料庫及如何安裝 Web Deploy 3.0 和在目的 Web 伺服器上 dbDacFx 提供者的詳細資訊,請參閱 HOW TO:在 Visual Studio 中使用按一下發行來部署 Web 應用程式專案

Dd394698.collapse_all(zh-tw,VS.110).gifdbFullSql Web 部署提供者

若要使用 dbFullSql Web 部署提供者,設定資料庫在專案屬性視窗中 [封裝/發行 SQL] 索引標籤的部署設定。 這個資料庫部署方法從 Visual Studio 2010 SP1 可用。 dbFullSql 提供者可以進行資料庫結構描述的初始部署,,也可以選擇部署資料和結構描述。 這個提供者不會將資料庫部署。 如果您嘗試使用這個提供者部署結構描述更新現有的資料庫,部署會失敗,因為提供者嘗試建立已存在的資料表。
dbFullSql 提供者是應該針對特定案例使用,只有在需要時,的舊版資料庫部署方法,當您使用的是 Windows XP 或 Windows Server 2003 作業系統上。 如需如何設定使用 dbFullSql 提供者的資料庫部署的詳細資訊,請參閱 專案屬性、封裝/發行 SQL 索引標籤 和 移轉至 SQL Server ASP.NET 網站。

根據您的應用程式中的情節或功能,與其他部署工作可能需要或適當的。 這個特定清單更常見部分:
  • 若要設定 Web.config 轉換。
    應用程式的 Web.config 檔案可能會包含必須不同於部署之應用程式的設定。 例如,您通常可以讓您在開發期間和停用它在實際執行環境。 如需詳細資訊, Web.config 檔案轉換 請參閱 ASP.NET 網站和 使用 Visual Studio 之 Web 應用程式專案部署的 Web.config 轉換語法
  • 指定要複製哪些檔案和資料夾加入至目的伺服器。
    根據預設, Visual Studio 部署所需的執行應用程式中的檔案。 這個選項適用於大部分案例適合,不過,您可能有特殊需求。 例如,在中,如果這些檔案只用於開發,您可能想要排除在 App_Data 資料夾中的資料庫檔案。 如需詳細資訊, 設定專案屬性 請參閱 ASP.NET 網站和 專案屬性、封裝/發行 Web 索引標籤
  • 在目的伺服器上設定資料夾的使用權限。
    您的應用程式可能需要寫入權限的部分專案資料夾。 例如,如果應用程式,可讓使用者上載檔案,它需要它儲存上載檔案的資料夾的寫入權限。 您必須明確地通常設定這些使用權限做為部署程序的一部分,或在已部署應用程式之後。 如需詳細資訊, 設定資料夾的使用權限 請參閱 ASP.NET 網站上。
  • 先行編譯專案。
    根據預設, .aspx 和 .ascx 網頁在 Web 應用程式專案未經先行編譯。 相反地,,第一次收到要求時,它們在編譯。 在非常大的應用程式,這個處理序便可能導致可觀的 Web 網頁會在部署之後第一次要求的些微的延遲。 如需 Web 應用程式專案的詳細資訊請編譯並合併選項,以及如何指定它們,請參閱 專案屬性、封裝/發行 Web 索引標籤 和 進階先行編譯設定對話方塊
  • 在部署期間,讓應用程式成為離線狀態。
    會在部署時,您可能不想讓使用者可以使用應用程式。 這通常是,在部署資料庫時,更新,因為可能會執行不同步到資料庫的應用程式程式碼的風險。 如需如何暫時讓應用程式成為離線狀態的詳細資訊,請參閱 Visual Studio 及 ASP.NET 的 Web 部署內容對應Making sure an application is off-line during deployment 。
  • 測試環境的網站類似會在部署之前產生。
    若要減少發現 Bug 的機會,在部署至實際執行環境之後,通常可測試在類似實際執行環境盡可能的環境中執行的應用程式。 若要這麼做,請在部署到實際執行伺服器之前,您可以部署到開發電腦上的 IIS,到開發用伺服器,或加入至測試帳戶在您的主控提供者。 如需詳細資訊, 部署至 IIS 當做測試環境 請參閱 ASP.NET 網站。
  • 設定 Visual Studio UI 未公開的部署設定。
    Visual Studio UI 不會公開您可以設定所有的部署設定。 例如,您不能使用 UI 從部署中排除個別資料夾。 不過,您可以編輯儲存組態設定的檔案執行這項作業。 對於每個發行設定檔具有您可直接編輯的 .pubxml 檔案。 如果您想要設定適用於所有發行設定檔的部署組態而定,您可以建立 .wpp.targets 檔案。 如需詳細資訊,請參閱HOW TO:編輯發行設定檔 (.pubxml) 檔案中的部署設定以及 Visual Studio Web 專案中的 .wpp.targets 檔案
  • 確定 ASP.NET MVC 的二進位檔複製到伺服器。
    如果您要部署至不支援 ASP.NET MVC 或您的目標版本其載入提供者時,請確定已安裝在您的專案中適當的 MVC 3 或 MVC 4 NuGet 套件。
  • 確定 SQL Server Compact 4.0 的二進位檔複製到伺服器。
    如果您要部署至不支援 SQL Server Compact 4.0 的載入提供者時,請確定已安裝在 SqlServerCompact 您的專案中 NuGet 套件。 您必須在專案中還包括 bin \ x86 和 bin \ amd64 資料夾。 如需詳細資訊, 部署 SQL Server Compact 資料庫請參閱

在您將更新部署至現有的網站之前,請先建立復原計劃,以便還原應用程式到原來的狀態,如果有任何錯誤。 視為的一些事項包括:
  • 支援站台和資源使用的程式碼。
    注意事項 警告
    不要假設,透過部署至伺服器專案建立備份。 編譯成組件的原始程式碼,在部署通常不會複製到伺服器。
  • 如果更新包含資料庫變更,請建立取消的回應將計劃資料庫變更。 您可能會想要事先建立復原指令碼以保護以免。 您可能也會想要考慮要執行的動作,如果有任何資料輸入變更定位在部署之後,但在復原之前,則為,如果其他應用程式使用同一資料庫。
  • 如果應用程式正在使用其他應用程式中,建立指定要對其復原計劃,則您必須復原更新。