2011-04-29 113 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 
}