我有一些32个文本框和1个“保存”按钮。我想要的是只保存其文本已更改的文本框的文本。我怎样才能做到这一点?我如何知道文本框已更改的文本?文本框中的文本更改
回答
您可以在客户端检测到此按键,或比较后的值并发送更改的项目列表。 但是,如果你想在服务器端做到这一点,你将不得不加载您的服务器数据,并手动将其与每个文本框进行比较。
使用会话变量来存储每个回发的数据并比较这些值。如果某个文本框的值发生变化,则保存,否则不保存。
会话变量不是序列友好的。然后您依赖会话,会话可能会在请求之间超时,您假设用户正在以特定顺序访问页面等。 – 2011-04-30 02:49:20
你可以使用HiddenFields。在页面加载时,您可以使用原始TextBox值设置HiddenField。 在保存按钮上,您可以将HiddenFields值与TextBox值进行比较,如果HiddenField值不是 与TextBox值匹配,则可以将该TextBox值保存在数据库中否则不会。
如果您没有使用.net 3.5或更高版本,这是实现它的最佳方式。否则,我建议以@ V4Vendetta提到的方式查看IPostBackDataHandler。 – 2012-05-16 10:42:00
就我个人而言,我会做服务器端。假设你有没有涉及数据绑定,你可以不喜欢你的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个相同的函数/属性。
只是我的偏好 - 我不会存储在ViewState中。如果viewstate验证关闭,则可以有意更改值,并且还会增加已经膨胀的viewstate的大小。我确实同意100% - 这应该是服务器端。 – 2011-04-30 02:47:13
使用cookie变量来存储每个回发的数据并比较这些值。
我不会 - 你在问问题。如果cookies被清除了怎么办?如果cookie过期怎么办?如果这些值在之前的会话中保持不变,因为该页面被缓存且不匹配后?如果同一页面的多个实例打开,该怎么办? – 2011-04-30 02:48:33
您使用的是哪个版本,如果是3.5及以上,我会要求您检查IPostBackDataHandler。这应该可以帮助你实现你想要的。
在以前的版本,我认为你将不得不做它只是通过与原文或至少你可以使用比较MERGE关键字 (你将不得不修改你的数据库查询),而你推你记录到数据库中。
我会建议在加载时使用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. 文本框中的文本更改
- 2. 其他文本框文本更改时更改文本框的文本
- 3. 更改此文本框的文本更改时文本框的背景颜色?
- 4. 文本框更改
- 5. 更改文本框
- 6. C#.NET更改文本框的文本
- 7. 无法更改文本框的文本
- 8. 文本框文本更改事件
- 9. Android单击更改文本框文本
- 10. 更改文本框的borderColor
- 11. 将文本更改为文本框后更新纯文本
- 12. 如何更改文本框中的文本取决于另一个文本框
- 13. 如果复选框被选中,则更改文本框文本
- 14. 更改文本框输入
- 15. Jade:文本框更改值=“...”
- 16. 文本框值已更改
- 17. 更改文本框值
- 18. 文本框更改事件
- 19. 更改VBA中相同文本框中的文本字体
- 20. VB.Net中的文本串联问题文本框中的文本更改事件
- 21. 在文本更改后用另一个文本框(子页面)更改文本框文本(父页面)
- 22. 改变多个文本框的值使用AJAX文本框中的值更改
- 23. 将文本框文本转换为日期文本更改
- 24. 更改文本框中的存储值
- 25. 文本框中的链接更改
- 26. 更改文本框中的值问题
- 27. 在输入文本的文本框更改边框颜色
- 28. 从另一个框架(容器)更改文本框的文本
- 29. 更改html中文本框的文本大小
- 30. 在Powerpoint幻灯片的文本框中更改文本
这听起来是一个巨大的工作量.. :(是值得的痛苦怎么可能通过onkeypress事件的事件呢? ?如果onkeypress是真的,即使那么我们必须检查每个32个文本框??? – scooby 2011-04-29 05:58:37
个人而言,我只是在服务器端做到这一点 - 它更可靠,在上述情况下,你可以通过几种方法做到这一点,我会加载一个文本框id和值的javascript数组,然后在发布后找出哪些与数组不匹配,然后发送更改隐藏字段中的id。但是..我会在服务器上执行此操作。客户端代码总是可以绕过/修改。请不要按照上面的一些建议与cookie等。尽可能多因为每个人的意见都被赞赏 - 饼干和会话使得这个问题变得非常不清楚。只需在服务器端加载数据 – 2011-04-30 02:50:54
并与发布的值进行比较。如果您使用自动映射器将页面上的值映射到对象中并比较对象,则可以使用它更清晰。 – 2011-04-30 02:51:37