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,对吗?抱歉,我误解了这个问题。我想你几乎可以忽略这一点。