C# 确定单击“提交”按钮时表单上是否有更改
我有一张有两个文本框的表格。我正在从数据库中检索数据 数据库来填充框。当我的用户单击提交按钮时 这两个文本框的内容没有改变,我不想看 密码 如何确定框的内容何时更改以及何时不更改? 我需要和我记忆中的东西做一些比较吗C# 确定单击“提交”按钮时表单上是否有更改,c#,asp.net-mvc,C#,Asp.net Mvc,我有一张有两个文本框的表格。我正在从数据库中检索数据 数据库来填充框。当我的用户单击提交按钮时 这两个文本框的内容没有改变,我不想看 密码 如何确定框的内容何时更改以及何时不更改? 我需要和我记忆中的东西做一些比较吗 public ActionResult Edit(profile objprofiler) { if (ModelState.IsValid) { //Go fetch
public ActionResult Edit(profile objprofiler)
{
if (ModelState.IsValid)
{
//Go fetch the existing profile from the database
var currentProfile = db.Profiles.FirstOrDefault(p => p.ProfileId == objprofiler.ProfileId);
//Update the database record with the values from your model
currentProfile.City = objprofiler.City;
currentProfile.State = objprofiler.State;
//Commit to the database!
db.SaveChanges();
ViewBag.success = "Your changes have been saved";
return View(profiler);
}
}
您可以将这些值与简单的
if
条件进行比较。大概是这样的:
if ((currentProfile.City != objprofiler.City) || (currentProfile.State != objprofiler.State))
{
currentProfile.City = objprofiler.City;
currentProfile.State = objprofiler.State;
db.SaveChanges();
}
或者用你想要达到的逻辑,真的。无论您是否要单独比较每个字段,请使用&&
而不是|
等。您想要实现的逻辑取决于您自己。但是您需要在if
语句中执行比较
还请注意,您可以使用string.Equals()
而不仅仅是=
操作符来比较字符串与其他一些选项,例如区分大小写选项和其他有用的内容
如果比较变得更复杂,您还可以将其封装在
概要文件
对象本身中。可能是通过重写.Equals()
,不过在测试相等性时,这还有其他含义。可能只是一个简单的辅助函数:
public bool IsEqualTo(profile obj)
{
return this.City == obj.City
&& this.State == obj.State;
}
然后在控制器中,您可以使用该方法:
if (!currentProfile.IsEqualTo(objprofiler))
db.SaveChanges();
我通常处理这种情况的方法是,每当表单的任何控件上发生数据更改事件时,都设置“dirty”标志 当用户提交表单时,我只是检查标志的状态,看看是否需要保存任何更改。这避免了将所有数据与其以前的状态进行比较,如果表单上有很多输入控件,这可能会造成麻烦 例如:
bool isDirty;
private void textBox_TextChanged(object sender, EventArgs e)
{
// Possible validation here
SetDirty(true);
}
private void SetDirty(bool dirty)
{
// Possible global validation here
isDirty = dirty;
}
private void Submit()
{
if(isDirty)
{
// Save logic
}
}
这种方法允许您在任何数据更改时运行任何全局验证逻辑
注意事项:如果用户进行了更改,然后将其还原,表单仍将提交数据。在客户端,您可以通过运行一些js将元素值与其初始值进行比较来检查值是否已更改。像这样的
function hasFormChanged() {
//textboxes, textareas
var els = document.querySelectorAll('input[type="text"], textarea, input[type="number"]');
for (i = 0; i < els.length; i++) {
var el = els[i];
if (el.value !== el.defaultValue) {
return true;
}
}
//checkboxes and radios
els = document.querySelectorAll('input[type="radio"], input[type="checkbox"]');
for (i = 0; i < els.length; i++) {
var el = els[i];
if (el.checked !== el.defaultChecked) {
return true;
}
}
//select
els = document.querySelectorAll('select');
for (i = 0; i < els.length; i++) {
var el = els[i];
if (el.options[el.selectedIndex].value != '') {
if (!el.options[el.selectedIndex].defaultSelected) {
return true;
}
}
}
//if we get here then nothing must have changed
return false;
}
函数hasFormChanged(){
//文本框,文本区域
var els=document.querySelectorAll('input[type=“text”],textarea,input[type=“number”]);
对于(i=0;i
如果该函数返回true,表示某些内容已更改,则可以像这样设置一个隐藏的表单值
<input type="hidden" value="false" id="AnyUpdates" name="AnyUpdates"/>
这是真的
然后在控制器更新中读取该字段,以确定是否需要执行db操作 那么,如果我有一个包含40个字段的表单,会发生什么呢。我会比较40个字段吗?要做到这一点,必须有更好的解决方案。你不这么认为吗?@user2320476:你到底想在这里实现什么?如果你想进行40次比较,那么你必须进行40次比较。您可以将比较封装在对象本身中,以便在控制器中调用该功能只需一行代码。(可能是重写
.Equals()
)我想问题真的变成了。。。所有这些额外的代码值得保存一次数据库访问吗?保存到数据库的行程真正实现了什么?如果性能那么差,那么问题可能在其他地方。我要说的是,必须有一种方法来确定代码有限的表单上的更改,而不是将40个字段与If语句进行比较。谢谢。@user2320476:定义“表单上的更改”。您有两个对象,每个对象有40个字段。您试图比较这些字段的值。您可以将其包装在助手函数和其他内容中,但是在某种程度上,如果您想要比较40个字段,那么您必须编写40个比较。除了通过比较值,没有其他方法可以比较值。INotify呢?表单上更改的定义如下所示。我有40个文本框,其中填充了来自数据库的数据。我在表单上有一个提交按钮。如果我单击submit按钮并更改40个文本框中的20个值,我将更新数据库。如果我不更改表单上的任何值并单击提交按钮,则不应更新数据库textBox\u TextChanged
?我觉得这不像MVC。虽然它确实带来了在客户端执行此逻辑的可能性,这是OP的另一个选项。如果他不关心用户是否绕过此逻辑,也就是说。是的textBox\u TextChanged windows开发对吗?这不是mvc,对吗?抱歉,我误解了这个问题。我想你几乎可以忽略这一点。