2011-04-29 115 views
3

我有一些32個文本框和1個「保存」按鈕。我想要的是隻保存其文本已更改的文本框的文本。我怎樣才能做到這一點?我如何知道文本框已更改的文本?文本框中的文本更改

回答

0

您可以在客戶端檢測到此按鍵,或比較後的值併發送更改的項目列表。 但是,如果你想在服務器端做到這一點,你將不得不加載您的服務器數據,並手動將其與每個文本框進行比較。

+0

這聽起來是一個巨大的工作量.. :(是值得的痛苦怎麼可能通過onkeypress事件的事件呢? ?如果onkeypress是真的,即使那麼我們必須檢查每個32個文本框??? – scooby 2011-04-29 05:58:37

+0

個人而言,我只是在服務器端做到這一點 - 它更可靠,在上述情況下,你可以通過幾種方法做到這一點,我會加載一個文本框id和值的javascript數組,然後在發佈後找出哪些與數組不匹配,然後發送更改隱藏字段中的id。但是..我會在服務器上執行此操作。客戶端代碼總是可以繞過/修改。請不要按照上面的一些建議與cookie等。儘可能多因爲每個人的意見都被讚賞 - 餅乾和會話使得這個問題變得非常不清楚。只需在服務器端加載數據 – 2011-04-30 02:50:54

+0

並與發佈的值進行比較。如果您使用自動映射器將頁面上的值映射到對象中並比較對象,則可以使用它更清晰。 – 2011-04-30 02:51:37

0

使用會話變量來存儲每個回發的數據並比較這些值。如果某個文本框的值發生變化,則保存,否則不保存。

+0

會話變量不是序列友好的。然後您依賴會話,會話可能會在請求之間超時,您假設用戶正在以特定順序訪問頁面等。 – 2011-04-30 02:49:20

0

你可以使用HiddenFields。在頁面加載時,您可以使用原始TextBox值設置HiddenField。 在保存按鈕上,您可以將HiddenFields值與TextBox值進行比較,如果HiddenField值不是 與TextBox值匹配,則可以將該TextBox值保存在數據庫中否則不會。

+0

如果您沒有使用.net 3.5或更高版本,這是實現它的最佳方式。否則,我建議以@ V4Vendetta提到的方式查看IPostBackDataHandler。 – 2012-05-16 10:42:00

1

就我個人而言,我會做服務器端。假設你有沒有涉及數據綁定,你可以不喜歡你的ASPX.CS代碼隱藏以下內容:

... 

private string InitialValue1 
{ 
    get { return ViewState[@"IV1"] as string; } 
    set { ViewState[@"IV1"] = value; } 
} 
// Repeat for all 32 text boxes. 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
    { 
     TextBox1.Text = InitialValue1 = loadText1FromDatabase(); 
     // Repeat for all 32 text boxes. 
    } 
} 

protected void MySaveButton_Click(object sender, EventArgs e) 
{ 
    if (TextBox1.Text!=InitialValue1) saveText1ToDatabase(TextBox1.Text); 
    // Repeat for all 32 text boxes. 
} 

... 

當然,在現實世界中的場景,我會做一些循環/陣列處理而不是編寫32個相同的函數/屬性。

+1

只是我的偏好 - 我不會存儲在ViewState中。如果viewstate驗證關閉,則可以有意更改值,並且還會增加已經膨脹的viewstate的大小。我確實同意100% - 這應該是服務器端。 – 2011-04-30 02:47:13

0

使用cookie變量來存儲每個回發的數據並比較這些值。

+0

我不會 - 你在問問題。如果cookies被清除了怎麼辦?如果cookie過期怎麼辦?如果這些值在之前的會話中保持不變,因爲該頁面被緩存且不匹配後?如果同一頁面的多個實例打開,該怎麼辦? – 2011-04-30 02:48:33

0

您使用的是哪個版本,如果是3.5及以上,我會要求您檢查IPostBackDataHandler。這應該可以幫助你實現你想要的。

在以前的版本,我認爲你將不得不做它只是通過與原文或至少你可以使用比較MERGE關鍵字 (你將不得不修改你的數據庫查詢),而你推你記錄到數據庫中。

1

我會建議在加載時使用jQuery函數來創建一個假的舊數據輸入。 事情是這樣的:

$(document).ready(function(){ 
$(":text").each(
var newid=$(this).attr("id") + "_old"; 
var oldvalue=$(this).val(); 
var formy=$("form"); 
formy.appendChild("<input type='hidden' name='" + newid +"' value='" + oldvalue +"'>); 
}) 

這樣一來,如果更改號碼,該功能會自動爲您編寫正確的號碼。 然後在服務器端,您可以用類似下面比較值:

var inputs = Request.Form.Keys.Where(rs=>rs.Contains("_old")); 
foreach (var input in inputs) 
{ 
    //check the _old vs the input without the old and do your thing 
}