单击提交按钮时确定表单上是否有更改

时间:2016-05-13 16:38:23

标签: c# asp.net-mvc

我有一个包含两个文本框的表单。我正在从中检索数据 填充框的数据库。当我的用户点击提交按钮时 并且2个文本框的内容没有变化,我不想通过 代码。

如何确定框内容何时更改以及何时更改? 我是否需要与记忆中的内容进行某种比较?

        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);
            }
        }

3 个答案:

答案 0 :(得分:1)

您可以将这些值与简单的if条件进行比较。像这样:

if ((currentProfile.City != objprofiler.City) || (currentProfile.State != objprofiler.State))
{
    currentProfile.City = objprofiler.City;
    currentProfile.State = objprofiler.State;

    db.SaveChanges();
}

或者使用你想要达到的任何逻辑,真的。无论您是要单独比较每个字段,请使用&&而不是||等。您要实施的逻辑取决于您。但是你要在if声明中进行比较。

另请注意,您可以使用string.Equals()而非==运算符来比较字符串以及更多选项,例如区分大小写选项和其他有用的内容。

如果比较变得更复杂,您也可以将其封装在profile对象本身中。也许通过覆盖.Equals(),虽然在测试平等时会产生其他影响。也许只是一个简单的辅助函数:

public bool IsEqualTo(profile obj)
{
    return this.City == obj.City
        && this.State == obj.State;
}

然后在控制器中你可以使用该方法:

if (!currentProfile.IsEqualTo(objprofiler))
    db.SaveChanges();

答案 1 :(得分:0)

我通常采用的方法是设置一个“脏”的方法。在任何表单控件上发生数据更改事件时标记。

当用户提交表单时,我只需检查标志的状态以查看是否需要保存任何更改。这样就不必将所有数据与之前的状态进行比较,如果表单上有很多输入控件,这可能会很麻烦。

例如:

    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
        }
    }

此方法允许您在任何数据更改时运行任何全局验证逻辑。

警告:如果用户进行了更改然后还原,表单仍会提交数据。

答案 2 :(得分:0)

在客户端,您可以通过运行一些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;
}

并且该函数返回true表示某些内容已更改,您可以设置隐藏的表单值,如此

 <input type="hidden" value="false" id="AnyUpdates" name="AnyUpdates"/>

为真。

然后在您的控制器更新中读取该字段以确定您是否需要执行数据库内容。