par*_*ent 5 jquery-validate unobtrusive-validation remote-validation asp.net-mvc-4
我一直在努力弄清楚为什么没有触发ValidationController动作.
我在项目范围的web.config中启用了设置:
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
Run Code Online (Sandbox Code Playgroud)
我有以下控制器:
[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
public class ValidationController : Controller
{
private readonly IUserRepository userRepository;
public ValidationController(IUserRepository userRepository)
{
this.userRepository = userRepository;
}
public JsonResult IsUserNameAvailable(string username)
{
User user = userRepository.Get(u => u.UserName == username);
if (user == null) return Json(true, JsonRequestBehavior.AllowGet);
else return Json(false, JsonRequestBehavior.AllowGet);
}
}
Run Code Online (Sandbox Code Playgroud)
和以下viewmodel:
[Required(ErrorMessage = "Required *")]
[StringLength(50, MinimumLength = 4, ErrorMessage = "Please keep the username between four and twenty character.")]
[Remote("IsUserNameAvailable", "Validation", ErrorMessage = "A user with this username already exists.")]
[Display(Name = "Username")]
public string UserName { get; set; }
Run Code Online (Sandbox Code Playgroud)
我的表格中有以下字段:
<form id="registerForm">
...
@Html.ValidationMessageFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
@Html.LabelFor(m => m.UserName)
</form>
Run Code Online (Sandbox Code Playgroud)
我做了ajax表单提交,并且已经完美地完成了服务器端验证:
$.post("/Account/Register", $('#registerForm').serialize(), function(){
updateFormWithServerGeneratedErrors();
})
Run Code Online (Sandbox Code Playgroud)
虽然服务器为我的字段生成了正确的输入标记:
<input ... data-val-remote-url="/Validation/IsUserNameAvailable" data-val-remote-additionalfields="*.UserName" data-val-remote="A user with this username already exists." ... >
Run Code Online (Sandbox Code Playgroud)
我可以通过在url中输入来手动点击我的操作:"/ Validation/IsUserNameAvailable?username = SomeName"但是Fiddler没有在按键或焦点更改上显示对此URL的任何请求.
根据本教程,我不需要编写任何javascript来实现这一点.是的,我开始修改表单时已经加载了jquery.validate.js和jquery.validate.unobtrusive.js脚本.
这里有什么问题?
好的,我找到了答案.
在这里引用Darin Dimitrov :
"不显眼的验证不会在动态添加元素到DOM的情况下开箱即用 - 例如向服务器发送AJAX请求,返回部分视图,然后将此部分视图注入DOM.
为了使其工作,您需要使用不显眼的验证框架注册这些新添加的元素.为此,您需要在新添加的元素上调用$ .validator.unobtrusive.parse.您应该将此代码放在将部分注入DOM的AJAX成功处理程序中."
框架在页面加载时调用此方法一次,我的场景中的问题是表单本身是一个jquery对话框,因此即使初始加载也是"动态的".我必须在对话框加载时使用不显眼的框架注册表单元素:
$.validator.unobtrusive.parse('#registerForm');
Run Code Online (Sandbox Code Playgroud)
如果它在服务器端没有验证,我的ajax调用也将返回并替换表单:
registerDialog.empty().html(result.viewResult);
Run Code Online (Sandbox Code Playgroud)
所以我不得不在成功回调上调用parse(),以确保在ajax提交后验证继续有效.
| 归档时间: |
|
| 查看次数: |
8467 次 |
| 最近记录: |