在将表单发回MVC时,如何检查是否有任何更改?

时间:2011-12-10 10:01:06

标签: asp.net-mvc asp.net-mvc-3

我在MVC中有一个编辑表单,在我的编辑POST操作中,我会在保存之前进行检查以确保我没有创建重复项。因此,例如,如果我更改表单上的标题,那么我检查标题是否已经存在。

但是,如果我打开编辑表单然后提交而不更改任何内容,那么操作会检查标题是否存在并将其标记为重复!

有什么方法可以检查模型是否未更改,如果是,那么跳过所有重复检查并尝试保存?

现在唯一的检查是:

            if (ModelState.IsValid)
            {

ModelState是否有一些等效的未更改?

3 个答案:

答案 0 :(得分:4)

有两个问题。第一个是如何检测表单内容的更改。这比处理更改事件和设置标志更微妙。我目前的方法是使用jQuery序列化表单在页面加载时选择的值:

{     
    $('#ObjectState').text(this.getSerialized());
},

getSerialized: function () {
    return $('form *').filter(':input').not('[type="hidden"]').serialize();
}

然后在表单提交期间:

if ($('#ObjectState').text() === this.getSerialized()) {
    alert('Nothing has changed on the form.');
    return false;
}

如果他们没有改变任何内容,这将阻止他们提交。

('ObjectState'是隐藏变量的名称,其初始值必须始终为空。如果页面上有多个表单,请从'form *'更改jQuery选择器以指定确切的表单。)< / p>

问题二有@lalibi上面的正确解决方案。您应该检查另一个实体(不同的ID)是否已经在使用该标题。在这种情况下,您还应该在数据库中为Title字段提供唯一索引。

答案 1 :(得分:1)

我建议更改操作中的逻辑,而不是试图查看模型是否已更改。

我认为你正在编辑的记录有一个Id,所以你目前正在进行的检查是重复的,可能是这样的:

SELECT Count(*) FROM Table WHERE Title = @title

如果您将其更改为

,该怎么办?
SELECT Count(*) FROM Table WHERE Title = @title AND Id <> @id

这不会解决你的问题吗?

答案 2 :(得分:0)

这是在mvc编辑控制器

中检查控制器是否已修改
    [HttpPost]
    [AuthorizeModelAccessActionFilter(TableID = TableID.Service_Country, Permission = Permission.Update)]
    public ActionResult Edit(Service_Country obj)
    {
        if (_context.Service_CountryQuery.Any(s => s.CurrencyID == obj.CurrencyID && s.MinPrice == obj.MinPrice) == true)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    _context.UpdateService_Country(obj);

                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError("", ex.Message);
                }
            }
        }
        else if (_context.Service_CountryQuery.Any(s => s.CurrencyID == obj.CurrencyID && s.MinPrice == obj.MinPrice )==false)
        {
            if (ModelState.IsValid)
            {
                try
                {


                    _context.UpdateService_Country(obj);

                    ModelState.AddModelError("", "Catalogue has been succesfully modified");
                    TempData["createinstanceerror"] = ModelState;
                    return RedirectToAction("Index");
                }

                catch (Exception ex)
                {
                    ModelState.AddModelError("", ex.Message);
                }
            }
        }

        return View(obj);
    }