2013年4月19日 星期五

ASP.NET的下載範例

 

適用在

window.open('download.aspx', '', 'toolbar=no,scrollbars=no,menubar=no,status=no,width=800,height=600');

不能用在下面這個敘述(不會產生預期的效果)

window.showModalDialog('download.aspx', '', 'dialogWidth: 800px;status:no;scroll:auto;toolbar:no;location:no');

使用下面的Tag Statement

<a id="DownLoadExcel" runat="server" Text="下載" onserverclick="DownloadExcel_Click"  >
    <asp:Literal runat="server" Text="下載" />
</a>

引用的函數如下:

protected void DownloadExcel_Click(object sender, EventArgs e)
{
    String NavigateUrl = "~/RelPath/sample." + this.CurrentLanguage + ".xls";
    FileInfo fileInfo = new FileInfo(Server.MapPath(NavigateUrl));
    Response.Clear();
    Response.ContentType = "application/vnd.ms-excel";
    Response.AddHeader("Content-Length", fileInfo.Length.ToString());
    //Content-Disposition Start
    //Content-Disposition 會影響下載視窗的顯示方式,沒有Content-Disposition也可下載)
    String FileName = fileInfo.Name;
    if (Request.Browser.Browser == "IE")
    {
        FileName = Server.UrlPathEncode(FileName);
    }
    string strContentDisposition = String.Format("{0}; filename=\"{1}\"", "attachment", FileName);
    Response.AddHeader("Content-Disposition", strContentDisposition);
    //Content-Disposition End
	
    Response.WriteFile(fileInfo.FullName);
    Response.Flush();
    Response.End();
    //ApplicationInstance.CompleteRequest();
}

2013年4月10日 星期三

[書摘]《領導者,該想甚麼?》13 學習成為一個激勵者

 

問題解決領導者非常重視法則,因為法則對一個人的思考方式影響巨大。

如果你想激勵某人以新方法做事情,但那人對於掌權者持懷疑態度,你就很可能遭遇困難。

了解對方心中有哪些法則,將能幫助你與對方互動。

生存法則:

每個人都有和他人相處的原則。
自幼形成的法則伴隨著我們成長,使我們得以適當應對人與事,因此我們對這些原則帶有感情。
你的生存法則即是你成為一個有效領導者的障礙。

後設法則(法則的法則):

後設法則掌控所有法則的思維觀念,也就是學習新法則的基礎。
因此,後設法則能決定,我們是否容易改變與他人互動的方式。

將法則轉換成指導原則

步驟1:清楚陳述你既有的生存法則

步驟2:說明這項法則的生存價值,並和你的潛意識進行交易

每一項法則都有它的理由。如果你能認清一項法則的理由,會比較容易改變它。
法則背後的原因可能已灰飛於歲月,但當時卻是生存所必須。
你知須對自己說:「這項法則曾經助我存活下來,對我而言相當有價值,因而我根本沒想過丟棄它的可能性。我會將它留在身邊,等到有朝一日適逢適當的情境,我可以拿出來應用。我可能會增添數個新法則,但如果我需要,就法則仍將在原地供我取用。」

步驟3:給自己選擇的機會

一旦你的潛意識認為,固守舊法則是最安全的道路。這時候,你可以建立一個觀念:舊法則是一個選項,是否拿出來運用完全由你決定。這個觀念的意思是,將舊法則由強迫性法則轉變為選擇性法則。

步驟4:由確定轉變為可能

既有法則隱含的其他法則。沒有一個人是全知全能者,人也不應當期望自己全知全能。

步驟5:由整體轉變為非整體

沒有人永遠完美,因此你必須去除普遍性。

步驟6:由普遍轉為特定

必須注意你心中是否有一項法則,即是創新的第三項障礙:「通往羅馬的道路只有一條。」為了避免新法則過於僵硬,你的新法則至少須具備三項以上的條件。

每個人都有健忘的本事,因此我們必須把整個過程白紙黑字記錄下來。

我發現這個程序很有助益,一旦完成法則轉變,我就把各個步驟詳細記錄在記事本裡。日後我有機會運用轉變後的新原則時,即檢視記事本,看自己做得如何。這也是履行我先前對自己潛意識所做的承諾,並提醒自己並非十全十美。在檢視的過程中,我或許會修改某項條件,或進一步釐清某項條件。

如果你希望影響他人,最好的方法即是,轉變使你覺得自己「毫無價值、毫無力量」的既有生存法則。你必須將既有的「我毫不重要」觀念,轉變成:

我如同其他人一樣重要。

這個方法的確很有效,而且無需運用其他特殊技巧。

2013年3月20日 星期三

節略HTML文字(文字內容包含連結等Tag)

有幾種可能的處理方式,分述如下:

  1. 前端<Div>的方式
<div style="width:450px; height: 18px;
         overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
         <asp:Label ID="Notice" runat="server" class="txt" />
</div>

    2.  Div配合綁定


<div title='<%# Eval("Notice") %>' style="cursor: hand; width: 153px; height: 20px;
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
<asp:LinkButton ID="ClassTitle" runat="server" Text='<%# Eval("Notice") %>' />

    3.  Div配合綁定與程式


<div id="GroupNameDiv" runat="server" style="cursor: hand; width: 153px; height: 20px;
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
<asp:Label ID="GroupName" runat="server" Text='' CssClass="txt"></asp:Label>&nbsp;
</div>                            
HtmlGenericControl GroupNameDiv = e.Item.FindControl("GroupNameDiv") as HtmlGenericControl;
GroupNameDiv.Attributes["title"] = GroupName.Text;

    4.  程式方式


int length = Regex.Replace(eItem.Content, "(?is)<.+?>", "").Length;
if (length < 40)
{
    Notice.Text = HtmlSubstring(eItem.Content, length);
}
else
{
    Notice.Text = HtmlSubstring(eItem.Content, 40) + "...";
}
public static string HtmlSubstring(string html, int maxlength)
{
    //initialize regular expressions
    string htmltag = "</?\\w+((\\s+\\w+(\\s*=\\s*(?:\".*?\"|'.*?'|[^'\">\\s]+))?)+\\s*|\\s*)/?>";
    string emptytags = "<(\\w+)((\\s+\\w+(\\s*=\\s*(?:\".*?\"|'.*?'|[^'\">\\s]+))?)+\\s*|\\s*)/?></\\1>";
    //match all html start and end tags, otherwise get each character one by one..
    var expression = new Regex(string.Format("({0})|(.?)", htmltag));
    MatchCollection matches = expression.Matches(html);
    int i = 0;
    StringBuilder content = new StringBuilder();
    foreach (Match match in matches)
    {
        if (match.Value.Length == 1
            && i < maxlength)
        {
            content.Append(match.Value);
            i++;
        }
        //the match contains a tag
        else if (match.Value.Length > 1)
            content.Append(match.Value);
    }
    return Regex.Replace(content.ToString(), emptytags, string.Empty);
}

2013年3月16日 星期六

集合介面的擴充關係

 

System.Collections

參考資料:

[書摘]《領導者,該想甚麼?》11 激勵他人的第二大障礙

 

我擔任團隊領導者,負責完成某項任務。當任務看似要失敗時,我將:

a. 任務擺第一,屬下次要。
b. 屬下擺第一,任務次要。
c. 平衡屬下與任務。
d. 逃離這個艱困情勢。
e. 以上皆非。

教戰守則1:
性命攸關的事,人務必擺在第一,毫無選擇的餘地。

教戰守則2:
如果工作的技術性不高,領導者無須具備技術能力,只需以恐懼進行領導。

教戰守則3:
有高超技術背景的人,可以將任何工作轉化成技術性工作,以逃避自己不願意的工作。

教戰守則4:
不關心下午的領導者,無法領導任何人,除非被領導者沒有其他選擇。

教戰守則5:
胸中無物卻假裝才高八斗,即便你非常關心他人,也不會有追隨者。

以下列原則衡量成敗:
當我完成的時候,他們是否對於討論的主題較不關心?
如果答案是肯定的,表示我失敗。如果答案是否定的,表示我相當成功。這就是所謂的溫伯格目標(Winberg Target)

教戰守則6:
工作取向的領導者常高估自己的成就。

教戰守則7:

我們從事的工作,很少值得我們犧牲對於未來的可能性。

如果你重視人甚於工作,或許你將失去完成任務的機會。但長久之後,這項任務已被遺忘,這些人卻仍然在你身邊,繼續共事,繼續影響更多人。


進一步而言,把人擺在第一位不一定減少任務成功的機率。大多數領導研究都是針對例行性工作,譬如如何在生產線上擔任主管,但複雜的技術性工作則是另一回事。當計劃發生問題的時候,只有適任的人有能力出面解決問題。

教戰守則8:
面對複雜的工作,沒有哪個領導者能保證,計畫不會「誤入歧途」。

教戰守則9:
成功的問題解決型領導者,必將人擺在第一位。

下列段落是薩提爾(Virginia Satir)對於領導者人性的觀點。
這篇文章是為醫生寫的,讀者可以將「醫生」改為「領導者」:


懸壺濟世是相當崇高的工作。為了負擔這項工作,醫生必須持續在人性和成熟度方面成長。我們面對的是人的生命。我認為,學習當一名醫生和學習當水電工迥然不同。水電工只需技術純熟即可,醫生則不止於此。水電工無須愛一根水管才修理它。醫生不屬於任何一種學派,任何一種技術派別,都必須以人性為立場,使對待自己一樣對待他人。


我教學的時候,非常重視醫療的人性面。我們是人,我們的醫療對象也是人。我們必須了解自己、愛自己,才能看見、聽見、觸見並了解我們的病人。我們營造的醫療氛圍,必須讓病人可以看見、聽見、觸見病了解我們。

教戰守則10:
領導者的工作對象就是人。除了人以外,領導者並無其他工作。

2013年3月14日 星期四

NeatUpload 進度列使用方式詳細說明

 

有鑑於網路上的的資訊大部分都是不完整的,部分是錯誤的,在花了不少時間的測試與問題排除後,終於找到可以正確運作的方法。

    1. 實際操作介面可參考http://www.brettle.com/Demo.aspx

    2. 先到http://neatupload.codeplex.com/下載NeatUpload壓縮檔案。

    3. 壓縮檔內的NeatUploadBinaries\bin\Brettle.Web.NeatUpload.dll是這次要使用的核心參考檔案。

    請注意檔案版本(請看檔案內容的詳細資料):

    l 1.3.4034.20191為確定可以運作的版本

    l 1.3.3034.31897為確定”不能”正常顯示進度列的版本。測試時可發現URL QueryString的prevStatus始終都為Unknown。

    1.3.4034.20191之相關訊息如下:

    MD5校驗值:33464845920CE706DA6A1C69FFDF5253

    image

    4. 拷貝NeatUploadBinaries\NeatUpload目錄到網站”根”目錄。

    請確定為根目錄,其他目錄將無法讀取NeatUpload必須使用到的檔案(像是NeatUpload.js、Progress.js),如果你碰到Javascrip錯誤,請務必檢查這一項。

    5. 新增UploadHttpModule到web.config中

    <httpModules>
    	<add name="UploadHttpModule" type="Brettle.Web.NeatUpload.UploadHttpModule, Brettle.Web.NeatUpload" />
    </httpModules> 
    6. 新增web.config的sectionGroup
    <sectionGroup name="system.web">
        <section name="neatUpload" requirePermission="false" type="Brettle.Web.NeatUpload.ConfigSectionHandler, Brettle.Web.NeatUpload" allowLocation="true" />
    </sectionGroup>


注意:allowLocation=”true” 允許下面區段可以對個別的網頁來做設定

7. 修改web.config以變更 ASP.NET 針對實作所支援的檔案上傳大小上限,並同時設定neatUpload區段

<httpRuntime maxRequestLength="100000" />
    <neatUpload useHttpModule="false" maxRequestLength="2048" efaultProvider="FilesystemUploadStorageProvider">
        <providers>
            <add name="FilesystemUploadStorageProvider" type="Brettle.Web.NeatUpload.FilesystemUploadStorageProvider" tempDirectory="D:\WebSites\TEMP\" />
	</providers>
    </neatUpload>

注意:neatUpload的maxRequestLength必須要小於或等於httpRuntime的maxRequestLength。maxRequestLength單位為KB,最大值2097151。

如果allowLocation="false",useHttpModule必須要設定為true。

useHttpModule=”true” && AutoStartCondition="true" 即可在網頁中見到進度條。

8. 新增web.config的location區段。

<location path="Modules/Processing.aspx">
    <system.web>
      <neatUpload useHttpModule="true" maxRequestLength="2097151" />
      <httpRuntime maxRequestLength="2097151" executionTimeout="3600" useFullyQualifiedRedirectUrl="true" />
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
</location>

注意:useHttpModule必須要設定為true,否則就算ProgressBar的AutoStartCondition=”true”還是不會顯示進度條。

9. 設定web.cong以變更 IIS7 在要求中所支援的內容最大長度。maxAllowedContentLength單位為bytes,最大值4294967295。

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="209715100" />
      </requestFiltering>
    </security>
</system.webServer>

注意:maxAllowedContentLength優先權高於maxRequestLength。maxAllowedContentLength預設值約為28.6MB。

也可以透IIS管理員的要求篩選來做設定:

image

10. 確認web.config中的trace設定,必須要為false,否則進度列不會顯示

<system.web>
    <trace enabled="false" pageOutput="true" localOnly="false" requestLimit="500" />
</system.web>
11. 在.aspx中放入


  • 描述詞屬性設定:<%@ Page EnableSessionState="false" Trace="false" %>

  • 註冊Tag:<%@ Register TagPrefix="Upload" Namespace="Brettle.Web.NeatUpload" Assembly="Brettle.Web.NeatUpload" %>

  • 上傳控制項:<Upload:InputFile id="inputFile" runat="server" />

  • 觸發用按鈕:<asp:Button ID="submitButton" runat="server" Text="Submit" />

  • 進度條:<Upload:ProgressBar id="inlineProgressBar" runat="server" inline="true" Triggers="submitButton" AutoStartCondition="true" Url="/NeatUpload/progress.aspx" />

12. 在.aspx.cs中加入Page_Load()

private void Page_Load(object sender, EventArgs e)
{
	if (!IsPostBack && Request.Params["processing"] == "true")
	{
		DoProcessing();
	}
}


13. 在.aspx.cs中加入DoProcessing()

private void DoProcessing()
{
	ProgressInfo progress = inlineProgressBar.ProcessingProgress = new ProgressInfo(5000, "Units");
	//for (int i = 1; i <= 5000; i++)	{
	//	System.Threading.Thread.Sleep(1);
	//	progress.Value = i;
	//}
	progress.Text = "Processing Complete";
}

14. 在.aspx.cs中的觸發事件中的適當位置加入DoProcessing()

private void submitButton _Clicked(object sender, EventArgs e)
{
	DoProcessing();
        
        //解除System.IO.IOException Message="由於已有另一個處理序正在使用該檔案,所以無法存取該檔案。"
	inputFile.FileContent.Close();
        inputFile.MoveTo(tmpFile, MoveToOptions.Overwrite); //存檔
}

15. 進度條的實際顯示是藉由嵌入在IFrame中的/NeatUpload/progress.aspx來顯示。



  • 各個Upload:DetailsSpan分別代表上傳的不同階段。可以由URL參數prevStatus看出是在哪個階段。

  • <Upload:DetailsSpan id="processing" 區段為一般上傳所使用。

  • <%# ProcessingHtml %>可以移除,否則會代入程式中所指定的值。這一段會在處理完畢後才使用。

  • 可修改標題、顯示的文字、CSS、取消上傳的圖示等。

16. 可用參數與詳細的描述,請參考官方文件(http://neatupload.codeplex.com/documentation)。


17. 加入多國語的方式如下:



    甲、將Progress.aspx第一行換成

    <%@ Page Language="C#" AutoEventWireup="false" CodeFile="Progress.aspx.cs" Inherits="NeatUpload_Progress" %>
    乙、加入以下程式碼到Progress.aspx.cs:
    public partial class NeatUpload_Progress : Brettle.Web.NeatUpload.ProgressPage
    {
        protected override void OnPreInit(EventArgs e)
        {
            CultureInfo ci = GlobalizationLibrary.Instance.GetCultureMapping(HubUtil.GetCurrentLanguage());
            Thread.CurrentThread.CurrentCulture = ci;
            Thread.CurrentThread.CurrentUICulture = ci;
        }
    }