文本框中的文本更改

3

我有32个文本框和1个“保存”按钮。我想仅保存那些文本框中已更改文本的内容。如何实现?我如何知道哪些文本框的文本已更改?

7个回答

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
}

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)中。如果关闭视图状态验证,值可以被故意更改,并且还会增加已经臃肿的视图状态的大小。尽管如此,我完全同意——这应该在服务器端完成。 - Adam Tuliper

0

您可以在客户端检测按键,或者比较提交的值并发送更改项列表来检测此项。但是,如果您想在服务器端执行此操作,您将需要加载服务器数据并手动将其与每个文本框进行比较。


这听起来是一项巨大的工作.. :( 这值得这么做吗?如何通过 onkeypress 事件完成?即使 onkeypress 为 true,我们仍然必须检查每个 32 个文本框吗?? - scooby
个人而言,我会在服务器端处理这个问题 - 这样更可靠。在上述情况下,您可以通过几种方式来解决,但我会加载一个文本框ID和值的JavaScript数组,并在提交时找出哪些不匹配该数组,然后将更改的ID作为隐藏字段发送。但是..我会在服务器上执行此操作。客户端代码总是可以被绕过/修改。请不要按照上面的某些建议使用cookie等。尽管大家的意见都很受欢迎,但cookie和session使其成为一个非常不干净的解决方案。只需加载数据即可。 - Adam Tuliper
在服务器端比较提交的值。如果您使用自动映射将页面上的值映射到对象并进行比较,则更容易遵循。 - Adam Tuliper

0
使用会话变量来存储每个 postback 的数据并比较值。如果某个文本框的值发生了改变,则保存该值,否则不保存。

会话变量不适合序列。您依赖于会话,会话可能在请求之间超时,您假设用户按特定顺序访问页面等。 - Adam Tuliper

0

您可以使用 HiddenFields。在页面加载时,您可以使用原始 TextBox 值设置 HiddenFields。 在保存按钮上,您可以将 HiddenFields 值与 TextBox 值进行比较,如果 HiddenField 值与 TextBox 值不匹配,则可以将该 TextBox 值保存在 DB 中,否则不保存。


如果您没有使用 .net 3.5 或以上版本,则这是最好的方法。否则,我建议查看像 @V4Vendetta 提到的 IPostBackDataHandler。 - Diego Garcia

0
使用Cookie变量存储每个回传的数据并比较值。

我不建议这么做 - 这会带来麻烦。如果cookie被清除了怎么办?如果cookie过期了怎么办?如果从以前的会话中的值仍然存在,因为页面被缓存并且在提交时不匹配怎么办?如果打开了同一页面的多个实例怎么办? - Adam Tuliper

0
你使用的是哪个版本?如果是3.5及以上版本,我建议你检查一下IPostBackDataHandler。这应该能帮助你实现你想要的功能。
在以前的版本中,我认为你只能通过将其与原始文本进行比较或者至少使用MERGE关键字(你将不得不修改你的数据库查询)在将记录推送到数据库时完成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接