【问题标题】:How can I check if nothing has been changed when posting back a form to MVC?将表单回发到 MVC 时,如何检查是否没有任何更改?
【发布时间】:2014-08-23 18:57:22
【问题描述】:

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

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

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

现在我唯一的支票是:

            if (ModelState.IsValid)
            {

ModelState 是否有一些等价物没有改变?

【问题讨论】:

  • 当用户“关闭表单”时,您不应该对同一操作执行 POST。当用户取消编辑时,您应该简单地将他重定向到其他地方。这不可能吗?
  • 我不这样做。当用户单击“保存”时,我返回到具有 [HttpPost] 的编辑操作。我的问题是,如果用户没有更改任何内容,我会遇到错误,因为它认为记录是原始记录的副本。
  • 因此,如果用户更改某些内容,您要保存一条新记录。如果他不做任何改变,那么你就直接忽略他的动作。我理解正确了吗?
  • 问题是我怎么知道他没有做任何改变?

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


【解决方案1】:

有两个问题。首先是如何检测表单内容的变化。这比处理更改事件和设置标志更微妙。我目前的方法是使用 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' 是一个隐藏变量的名称,其初始值必须始终为空。如果页面上有多个表单,请将 jQuery 选择器从 'form *' 更改为指定确切的表单。)

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

【讨论】:

    【解决方案2】:

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

    我假设您正在编辑的记录有一个 Id,因此您当前正在执行的重复检查可能类似于:

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

    如果你把它改成

    SELECT Count(*) FROM Table WHERE Title = @title AND Id <> @id
    

    这不能解决你的问题吗?

    【讨论】:

      【解决方案3】:

      这个是在edit中检查控制器是否在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);
          }
      

      【讨论】:

        猜你喜欢
        • 2015-07-27
        • 1970-01-01
        • 2013-09-05
        • 2015-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多