我有一个带有RemoteValidation属性的模型。
当我输入已经存在于数据库中的“test”时,我点击了除OK按钮以外的区域,然后我得到了红色:“测试已经存在”。到现在为止还挺好。当我点击时,OK按钮发布到我要求的创建动作
ModelState.IsValid总是如此???
因此,数据输入数据库,我得到一个Duplicate Exception ...
我知道这在我的网站上有效,我只是改变了一些东西而且颠覆不是
激活了arghhh ......
我错了什么?
[HttpPost]
public ActionResult Create(Release release)
{
if (ModelState.IsValid)
{
_releaseDataProvider.AddRelease(release);
return Json(new { success = true });
}
return PartialView(release);
}
public JsonResult ReleaseExists(string Name)
{
bool releaseExists = _releaseDataProvider.ReleaseExists(Name);
if (!releaseExists)
{
return Json(true, JsonRequestBehavior.AllowGet);
}
else
{
return Json(false, JsonRequestBehavior.AllowGet);
}
}
$.ajaxSetup({ cache: false });
$(document).ready(function () {
$('#CreateRelease').click(function (event) { loadDialog(this, event, createRelease); });
});
function loadDialog(link, e, ajaxRequest) {
e.preventDefault();
var $title = link.innerHTML;
var $contenturl = $(link).attr('href');
var $dialog = $('<div></div>');
var $height = $(link).attr('data-dialog-height');
var $width = $(link).attr('data-dialog-width');
$dialog.load($contenturl).dialog({
title: $title,
autoOpen: true,
modal: true,
show: 'fade',
hide: 'fade',
width: $width,
height: $height,
buttons: {
"OK": function () {
ajaxRequest($(this), $('form', this));
},
"Cancel": function () {
$dialog.dialog("close");
}
}
});
}
function createRelease(dlg, form) {
$.ajax({
url: $(form).attr('action'),
type: 'POST',
data: form.serialize(),
success: function (response) {
if (response.success) {
dlg.dialog("close");
// Update UI
}
else {
// Reload the dialog with the form to show model/validation errors
dlg.html(response);
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus + '-' + XMLHttpRequest.responseText);
}
});
}
答案 0 :(得分:2)
ModelState.IsValid总是如此???
这是正常的,只有在通过AJAX调用控制器操作时才应用远程验证规则。正常提交表单时,同样的操作不。因此,您可以在POST操作中调用相应的验证方法:
[HttpPost]
public ActionResult Create(Release release)
{
if (ModelState.IsValid && !_releaseDataProvider.ReleaseExists(release.Name))
{
_releaseDataProvider.AddRelease(release);
return Json(new { success = true });
}
return PartialView(release);
}