zl程序教程

您现在的位置是:首页 >  其它

当前栏目

RemoteAttribute Class

Class
2023-09-11 14:14:17 时间

RemoteAttribute Class

Provides an attribute that uses the jQuery validation plug-in remote validator.

 

表单中的输入项,有些是固定的,不变的验证规则,比如字符长度,必填等。但有些是动态的,比如注册用户名是否存在这样的检查,这个需要访问服务器后台才能解决。这篇文章将会介绍MVC中如何使用【RemoteAttribute】来解决这类验证需求,同时会分析【RemoteAttribute】的不足,以及改进的方法.

本文相关的源代码在这里 MVC-Remote-Validation.zip

一, RemoteAttribute验证使用

如果需要用户把整个表单填完后,提交到后台,然后才告诉用户说,“你注册的用户已经被占用了,请换一个用户名”,估计很多用户都可能要飚脏话了.

MVC中的Remote验证是通过Ajax实现的,也就是说,当你填写用户名的时候,就会自动的发送你填写的内容到后台,后台返回检查结果

1. 实现Remote验证非常简单,首先需要有个后台的方法来响应验证请求, 也就是需要创建一个Controller, 这里我们用ValidationController:

public class ValidationController : Controller
{
       public JsonResult IsEmployeeNameAvailable(string employeeName)
       {
           //这里假设已经存在的用户是”justrun”, 如果输入的名字不是justrun,就通过验证
           if (employeeName != "justrun")
           {
               return Json(true, JsonRequestBehavior.AllowGet);
           }
           return Json("The name 'justrun' is not available, please try another name.", JsonRequestBehavior.AllowGet);
       }
}

 

2. 接着在我们的Employee Model上应用上RemoteAttribute

public class Employee
{
      public int EmpId { get; set; }
      [DisplayName("Employee Name")]
     [Remote("IsEmployeeNameAvailable", "Validation")] //使用RemoteAttribute,指定验证的Controller和Action
      public String EmployeeName { get; set; }

}

3. 对应的View

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()

    <fieldset>
        <legend>Registration Form</legend>
        <ol>
            <li>
                @Html.LabelFor(m => m.EmployeeName)
                @Html.EditorFor(m => m.EmployeeName)
                @Html.ValidationMessageFor(m => m.EmployeeName)
            </li>
        </ol>
        <input type="submit" value="Register" />
    </fieldset>
}

4. 最后,看看验证的效果

 

 通过firebug能够看到,在填写表单的过程中,会不断的把表单的EmployeeName发送到我们指定的Controller, Action上做验证。

 

二, RemoteAttribute的局限性

使用 【RemoteAttribute】 来做远端验证的确是很棒– 它会自动的发起AJAX请求去访问后台代码来实现验证. 但是注意, 一旦表单提交了,就不会在存在这个验证了。比如当我用上【Required】这个验证标签的时候,无论在客户端还是服务器端,都存在着对于必填项的验证。服务器端可以通过ModelState.IsValid非常容易地判断,当前提交到后台的表单数据是否合法。但是【RemoteAttribute】只有客户端验证,而没有服务器端验证。 也就是说,如果用户的浏览器中,关闭js,我们的Remote检查就形同虚设。

是不是非常意外, 当接触Remote验证的时候,原以为默认的就会认为它会和其它验证标签一样。所以使用RemoteAttribute验证,是存在一定的安全隐患的。

三, RemoteAttribute的改进

先介绍一下对于RemoteAttribute的改进思路:

如果我们也想让RemoteAttribute和其它的验证特性一样工作,也就是说,如果不符合Remote的验证要求,我们希望ModelState.IsValid也是false, 同时会添加上相应的ModelError. 这里选择在MVC的Model binding的时候,做这个事情,因为在Model Binding的时候,正是将表单数据绑定到对应的model对象的时候。只要在绑定的过程中,如果发现Model中的属性有使用RemoteAttribute, 我们调用相应的验证代码。验证失败了,就添加上对于的ModelError.

 

由于涉及到了Model Binding和Atrribute的使用,如果有兴趣的,可以先看看这2篇文章:

Asp.net MVC使用Model Binding解除Session, Cookie等依赖 

.Net Attribute详解(上)-Attribute本质以及一个简单示例

原文有具体的实现,可以去原文看。 

 

背后的原理

Remote Validation In MVC 5 Using Remote Attribute

Parameters which need to be added when decorating a property with Remote attribute.

 

  • IsUserNameAVailable – this is the method which will get invoked
  • Users - controller where the above method belongs
  • ErrorMessage - if validation failed, this message will be displayed

Include the below references in  Create.cshtml file. jQuery, jquery.validate and jquery.validate.unobtrusive script files are required for remote validation to work.

<script src="~/Scripts/jquery-1.10.2.min.js"></script>  
    <script src="~/Scripts/jquery.validate.min.js"></script>  
    <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>  

Css also can be referenced

<linkhref="~/Content/Site.css"rel="stylesheet"/> 

Make sure ClientValidation and UnobtrusiveJavaScript are enabled in web.config,

Unobstrusive JavaScript Validation

One of the more useful things MVC includes is Unobtrusive Validation with the usage of the jQuery Validate plugin and the Unobtrusive library.

This lightweight library allows us to add validation to our MVC views without any additional client-side coding;

we only have to use attributes like RequiredAttribute and RangeAttribute and include the correct script files.

Enabling and Disabling Client-Side Validation at Application Level

We can enable and disable the client-side validation by setting the values of ClientValidationEnabled & UnobtrusiveJavaScriptEnabled keys true or false. This setting will be applied to the application level,
 
  1. <appSettings>  
  2.    <addkey="ClientValidationEnabled"value="true"/>  
  3.    <addkey="UnobtrusiveJavaScriptEnabled"value="true"/>  
  4. </appSettings>   
Is it possible to turn these features on or off using code?
 
Yes, this feature can be enabled or disabled in Application_Start() in Global.asax.cs file.