我在MVC中有一个编辑表单,在我的编辑POST操作中,我会在保存之前进行检查以确保我没有创建重复项。因此,例如,如果我更改表单上的标题,那么我检查标题是否已经存在。
但是,如果我打开编辑表单然后提交而不更改任何内容,那么操作会检查标题是否存在并将其标记为重复!
有什么方法可以检查模型是否未更改,如果是,那么跳过所有重复检查并尝试保存?
现在唯一的检查是:
if (ModelState.IsValid)
{
ModelState是否有一些等效的未更改?
答案 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);
}