2008-09-10 18 views
2

我有以下的網絡表單:防止多線ASP:從修行文本框提要

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" 
    Inherits="TestWebApp.Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:TextBox ID="txtMultiLine" runat="server" 
      Width="400px" Height="300px" TextMode="MultiLine"></asp:TextBox> 
     <br /> 
     <asp:Button ID="btnSubmit" runat="server" 
      Text="Do A Postback" OnClick="btnSubmitClick" /> 
    </div> 
    </form> 
</body> 
</html> 

,每次我後回到領先的線在文本框中飼料時被刪除。有什麼方法可以阻止這種行爲?

我想創建一個從文本框繼承的自定義控件,但我想首先在這裏得到一個理智檢查。

回答

2

我落得這樣做在btnSubmitClick(以下)

public void btnSubmitClick(object sender, EventArgs e) 
{ 
    if (this.txtMultiLine.Text.StartsWith("\r\n")) 
    { 
     this.txtMultiLine.Text = "\r\n" + this.txtMultiLine.Text; 
    } 
} 

我一定很疲勞或生病什麼的。

2

我認爲這裏的問題是瀏覽器呈現textarea內容的方式,而不是ASP.NET本身。這樣做:

public void btnSubmitClick(object sender, EventArgs e) { 
    this.txtMultiLine.Text = "\r\n" + this.txtMultiLine.Text; 
} 

將讓您達到所需的屏幕輸出,但您將添加一個額外的換行到用戶沒有輸入的文本。

理想的解決方案是讓ASP.NET中的TextBox控件始終在寫入開放標籤之後和寫入文本內容之前寫入換行符。這樣,您可以達到預期的效果,而不會超出文本框的內容。

我們可以從文本框繼承並通過重寫RenderBeginTag解決這個問題:

public override void RenderBeginTag(HtmlTextWriter writer) { 
    base.RenderBeginTag(writer); 
    if (this.TextMode == TextBoxMode.MultiLine) { 
    writer.Write("\r\n"); // or Environment.NewLine 
    } 
} 

現在,這個小問題,創建一個新的類似乎真的矯枉過正,所以你的務實的做法是完全可以接受的。但是,我會將其更改爲在頁面的PreRender事件中運行,該事件在頁面生命週期中非常晚,並且不會干擾在按鈕的OnSubmit事件中處理提交的文本:

protected void Page_Load(object sender, EventArgs e) { 
    this.PreRender += Page_OnPreRender; 
} 
protected void Page_OnPreRender(object sender, EventArgs e) { 
    this.txtMultiLine.Text = "\r\n" + this.txtMultiLine.Text; 
}