在视图

时间:2015-05-06 13:15:39

标签: jquery ajax asp.net-mvc unobtrusive-validation

我在 ASP.NET MVC 4 应用程序中的Remote上使用ViewModel属性。这是我的简单模型:

public class User
{
    [Required(AllowEmptyStrings = false, ErrorMessage = "test test")]
    public int Id { get; set; }

    [DisplayName("Email")]
    [Remote("RemoteValidateEmailLengthValidation", "Home")]

    public string Email { get; set; }
}

远程验证方法:

public JsonResult RemoteValidateEmailLengthValidation(string Email)
{
    if (Email.Length > 20)
    {
        return Json("Too long email", JsonRequestBehavior.AllowGet);
    }
    else
    {
        return Json(true, JsonRequestBehavior.AllowGet);
    }
}

我在Layout上添加了验证所需的所有脚本:

@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryui")
@Scripts.Render("~/bundles/jqueryval")

WebConfig中写下我需要验证的所有内容:

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

添加简单的Controller,创建空模型并返回View

@model ViewModels.User

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@using (Html.BeginForm("PostUser", "Home", FormMethod.Post))
{
    @Html.EditorForModel()
    <input type="submit" />
}

仅当我将模型包裹在form中且不起作用时,如果我像这样写View,它才有效:

@model ViewModels.User

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@Html.EditorForModel()

所以我有疑问:

  1. 为什么远程验证在没有表单的情况下无效?因为在Chrome调试器中我看到该表单不提交,所以我只看到验证方法调用。
  2. 远程验证使用哪种javascript方法? OnChange?我可以在任何地方看到它,我可以改变它吗?

2 个答案:

答案 0 :(得分:1)

客户端不引人注意的验证涉及

  1. 在服务器端:用于生成表单控件的所有HtmlHelper 在内部调用GetUnobtrusiveValidationAttributes方法 HtmlHelper。执行各种检查,如果不是全部的话 条件得到满足(例如UnobtrusiveValidation已被禁用) 那么客户端验证需要data-val属性 未呈现
  2. 在客户端:jquery.validation.unobtrusive.js时 加载后,它首先检查是否存在<form>标记 根据{{​​1}}属性,添加规则,消息等 由data-val使用。
  3. 第一个被调用的函数是

    jquery.validate

    其中parse: function (selector) { var $forms = $(selector) .parents("form") .andSelf() .add($(selector).find("form")) .filter("form"); .... 是html文档元素。如果没有selector元素,则<form>未定义,并且不执行任何其他操作。如果没有var $forms元素,则客户端验证不起作用。

    目前还不清楚为什么你会生成不在表单中的html表单控件,但你可以简单地自己调用控制器函数,返回一条消息并显示它

    <form>

    和脚本

    public JsonResult RemoteValidateEmailLengthValidation(string Email)
    {
        if (Email.Length > 20)
        {
            return Json("Too long email", JsonRequestBehavior.AllowGet);
        }
        else
        {
            return Json(null, JsonRequestBehavior.AllowGet);
        }
    }
    

    并处理var url = '@Url.Action("RemoteValidateEmailLengthValidation", "Home")'; var placeHolder = $('[data-valmsg-for="Email"]'); $('#Email').change(function() { $.getJSON(url, { Email: $(this.val() }, function(response) { if(response) { placeHolder.text(response).removeClass('field-validation-valid').addClass('field-validation-error'); } }); }); 事件以删除错误消息并重置类名

答案 1 :(得分:0)

无法在aspnet 5中找到JsonRequestBehavior

[HttpGet]
public JsonResult IsAllowedName(string FirstMidName)
{
    if (FirstMidName.ToLower() == "oleg")
    {

        //It seems that Microsoft.Asp.Net.Mvc does 
        //not contain JsonRequestBehavior enum
        return Json(false, JsonRequestBehavior.AllowGet); 
    }
    return Json(true);
}

终端输出

dnu build
/.../Controllers/ValidationController.cs(20,24):
DNXCore,Version=v5.0 error CS0103: 
The name 'JsonRequestBehavior' does not exist in the current context
Build failed.