2015-05-06 50 views
1

我在我的ViewModel中使用Remote属性ASP.NET MVC 4应用程序。这是我简单的模型:在ASP.NET MVC中使用远程验证,无窗体查看

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?我可以在任何地方看到它吗?我可以改变它吗?
+0

尝试取出''@当它是'using'子句 – jbutler483

+0

的'数据-val- *内'的jQuery unobtrusve验证的必要的属性不除非在表单内生成html助手,否则该方法将永远不会被调用(这是设计)。你为什么要改变方法? –

+0

@ jbutler483你不明白。 **它使用表单工作**。但是,如果View上没有任何表单,则不会触发。我认为这应该是脚本问题,但我不知道为什么。 –

回答

1

客户端侧不显眼的验证涉及

  1. 在服务器端:用于生成形式所有的HtmlHelper控制 内部调用GetUnobtrusiveValidationAttributes方法的HtmlHelper 。各种检查被执行,并且如果不是所有 条件被满足(例如UnobtrusiveValidation已被禁用) 则data-val属性necesary为客户端验证 不会呈现
  2. 在客户端:当jquery.validation.unobtrusive.js是 加载时,它首先检查是否存在<form>标记,然后 基于data-val属性,为 添加规则,消息等,使用jquery.validate

调用的第一个功能是

parse: function (selector) { 
    var $forms = $(selector) 
     .parents("form") 
     .andSelf() 
     .add($(selector).find("form")) 
     .filter("form"); 
    .... 

其中selector是HTML文档元素。如果没有<form>元素,则var $forms未定义,不再执行任何操作。如果没有<form>元素,则客户端验证根本不起作用。

不明确的,你为什么会产生是不是一个形式的HTML表单控件,但你可以简单地让自己的呼叫控制功能,返回的消息,并显示它

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'); 
    } 
    }); 
}); 

,并处理.keyup活动,删除错误信息并重置类名

0

广东话在aspne找到JsonRequestBehavior吨5

[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.