Asp.net mvc 4 ASP.NET MVC RemoteAttribute验证不起作用-未执行操作

Asp.net mvc 4 ASP.NET MVC RemoteAttribute验证不起作用-未执行操作,asp.net-mvc-4,jquery-validate,unobtrusive-validation,remote-validation,Asp.net Mvc 4,Jquery Validate,Unobtrusive Validation,Remote Validation,我一直在绞尽脑汁想弄清楚为什么ValidationController操作没有被触发 我已在project wide web.config中启用设置: <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 以及以下viewmodel: [Required(ErrorMessage = "Required

我一直在绞尽脑汁想弄清楚为什么ValidationController操作没有被触发

我已在project wide web.config中启用设置:

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
以及以下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; }
我的表格中有以下字段:

<form id="registerForm">
     ...
     @Html.ValidationMessageFor(m => m.UserName)
     @Html.TextBoxFor(m => m.UserName)
     @Html.LabelFor(m => m.UserName)
</form>
尽管服务器为我的字段生成了正确的输入标记:

<input ... data-val-remote-url="/Validation/IsUserNameAvailable" data-val-remote-additionalfields="*.UserName" data-val-remote="A user with this username already exists." ... >

我可以通过在url中键入“/Validation/IsUserNameAvailable?username=SomeName”来手动点击我的操作,但Fiddler不会在按键或焦点更改时显示对此url的任何请求

据我所知,我不需要编写任何javascript来实现这一点。是的,当我开始修改表单时,已经加载了jquery.validate.js和jquery.validate.unobtrusive.js脚本


这里有什么问题

验证函数未被激发的原因是以下代码

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);
}
应添加到
帐户控制器
,而不是
验证控制器
。删除
ValidationController
类,并将
isusernameavable
方法添加到
AccountController
类中

还要更改模型中的线条,应该是这样的

[System.Web.Mvc.Remote("IsUserNameAvailable", "Account")]

这将解决问题。

您似乎忘记为表单指定绑定操作。我尝试了下面的代码,它的工作

<form id="registerForm" action="Controller/Action">
     @Html.ValidationMessageFor(m => m.UserName)
     @Html.TextBoxFor(m => m.UserName)
     @Html.LabelFor(m => m.UserName)
</form>
好的,我找到了答案

引用达林·迪米特罗夫的话:

“对于动态添加到DOM中的元素,不引人注目的验证不会立即生效-例如,向服务器发送AJAX请求,服务器返回部分视图,然后将该部分视图注入DOM

为了使其正常工作,您需要使用unobtrusive validation framework注册这些新添加的元素。为此,您需要对新添加的元素调用$.validator.unobtrusive.parse。您应该将此代码放在将部分插入DOM的AJAX成功处理程序中。”

框架在页面加载时调用此方法一次,我的场景中的问题是表单本身是一个jquery对话框,因此即使初始加载也是“动态的”。在对话框加载时,我必须使用不显眼的框架注册表单元素:

$.validator.unobtrusive.parse('#registerForm');  
如果表单没有在服务器端验证,我的ajax调用也会返回并替换表单,如下所示:

registerDialog.empty().html(result.viewResult);

因此,我还必须在成功回调上调用parse(),以确保验证在ajax提交后继续工作。

我也遇到了类似的问题。只需改变这一点:

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);
}
致:

username
username
哪个是您的

public string UserName { get; set; }
我认为它是区分大小写的


希望它能有所帮助:)

您需要从

public JsonResult IsUserNameAvailable(string username)

public JsonResult IsUserNameAvailable(string UserName)

它应该与属性名称相同,区分大小写。

谢谢,但这没有什么区别。我将viewmodel添加到OP中,显示路线,可以手动点击。显然,在尝试您的解决方案时,我将其更改为“Account”;在我的标题中,但我试图像你说的那样明确地做,但仍然一无所获。Fiddler没有显示对路线的呼叫。你知道js文件中有哪行是我应该在firefox中打开的,看看它是否被调用。我已经按照如下所述的顺序加载了jquery、jquery.unobtrusive-ajax、jquery.validate和jquery.validate.unobtrusive:我没有注意到您进行ajax提交,您需要这样做:if($('#registerForm').valid()){($.post(“/Account/Register”,$('#registerForm').serialize(),function(){updateFormWithServerGeneratedErrors();}})嗯,我不确定这会有什么帮助,因为我试图在按键或焦点丢失时自然触发验证。ajax提交只在单击“提交”按钮时发生,因此这似乎与“实时”验证无关。我实际上没有得到“实时”验证验证我的任何输入,而不仅仅是关于远程调用的输入。现在就投票表决您的努力,谢谢。感谢您的评论。我使用@using(Html.BeginForm(“JsonRegister”,“Account”,FormMethod.Post,new{id=“registerForm”,class=“popupForm”})){//form但这并没有造成什么不同。原因是我正在对我的控制器进行Ajax调用,所以我不需要action属性。什么是成功回调?类似的问题是另一页:
public JsonResult IsUserNameAvailable(string Username)
{
    User user = userRepository.Get(u => u.UserName == Username);
    if (user == null) 
    {
        return Json(true, JsonRequestBehavior.AllowGet);
    }
    return Json(false, JsonRequestBehavior.AllowGet);       
}
public string UserName { get; set; }
public JsonResult IsUserNameAvailable(string username)
public JsonResult IsUserNameAvailable(string UserName)