2012-05-19 171 views
6

我指的是这篇文章:客户端验证Asp.Net MVC 4

http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

它展示了如何在Asp.Net MVC创建自定义的注释。然而,客户端验证脚本,特别是“MicrosoftMvcJQueryValidation”在Asp.Net MVC4中不可用。我在一篇文章中读到它是Asp.Net Futures项目的一部分。我想用Jquery连接我的客户端验证。在我的项目模板脚本的文​​件夹中,我看到脚本命名为:

jquery.validate.min.js 
jquery.validate.unobtrusive.min.js 
jquery.unobtrusive-ajax.min.js 

有什么办法,我可以利用这些现有的脚本吗?还是我必须强制下载期货项目?

+1

谷歌“MVC 3自定义验证”,你会发现像http://msdn.microsoft.com/en-us/vs2010trainingcourse_aspnetmvccustomvalidation_topic3和http://tdryan.blogspot.com/2010/12/aspnet- mvc-3-custom-validation.html – RickAndMSFT

+0

@RickAndMSFT:当你在没有阅读的问题上盲目地发布链接时,会发生这种情况。 http://msdn.microsoft.com/en-us/vs2010trainingcourse_aspnetmvccustomvalidation_topic3不是关于Jquery验证。它使用MicrosoftMvcValidation.js进行客户端验证,我不需要,因为我明确提出了问题,并且http://tdryan.blogspot.in/2010/12/aspnet-mvc-3-custom-validation.html使用内置RegularExpressionAttribute自动生成客户端脚本。我没有使用RegularExpressionAttribute。根据你的链接,我最好不要谷歌:D –

+1

阅读任何我的教程下面的回应。为MVC 4更新它们并不难。概念是相同的。 – RickAndMSFT

回答

14

该文章特定于使用MicrosoftAjax的MVC 2。 MVC 4不再包含MS Ajax文件,因为它们已被弃用,首选的方法是使用jQuery。

要验证设置,确保这些脚本是在你的布局

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script> 

而这两个设置存在于appSettings部分在web.config文件

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

所以,当你添加数据注释到您的ViewModels您可以获得客户端和服务器端验证两者

public class MyModel 
{ 
    [Required] 
    [StringLength(30)] 
    public string FirstName { get; set; } 

    [Required] 
    [StringLength(30)] 
    public string LastName { get; set; } 
} 

在你看来只是确保你有一个像这样

<div> 
    @Html.LabelFor(model => model.FirstName) 
</div> 
<div> 
    @Html.TextBoxFor(model => model.FirstName) <br/> 
    @Html.ValidationMessageFor(model => model.FirstName) 
</div> 

<div> 
    @Html.LabelFor(model => model.LastName) 
</div> 
<div> 
    @Html.TextBoxFor(model => model.LastName) <br/> 
    @Html.ValidationMessageFor(model => model.LastName) 
</div> 

更新

下面的代码是,我已经叫RateRequiredIfCustomIndexRate 一个自定义验证的例子这是它的JavaScript端,使其被添加到jquery验证

$("document").ready(function() { 

    var isCustomRateRequired = document.getElementById("IsCustomRateRequired"); 

    isCustomRateRequired.onchange = function() { 
     if (this.checked) { 
      $('#Rate').attr('disabled', 'disabled'); 
      $('#Rate').val(''); 
     } 
     else { 
      $('#Rate').removeAttr('disabled'); 
     } 
    }; 
}); 

jQuery.validator.addMethod("raterequiredifcustomindexrate", function (value, element, param) { 
    var rateRequired = $("#CustomRateRequired").val(); 
    if (rateRequired && value == "") { 
     return false; 
    } 
    return true; 
}); 

jQuery.validator.unobtrusive.adapters.addBool("raterequiredifcustomindexrate"); 
+0

那么,如何使用这些脚本来连接我的客户端验证?任何教程?文章? –

+0

这很简单,你得到免费的:-)当你与数据注解装饰你的视图模型类,这些相同的规则会转换到客户端规则..更新我的答案现在 –

+0

这真的可能吗?这是我的自定义验证注释。我已经扩展使用*** ValidationAttribute ***我的C#代码服务器端验证如何自动转换为JQuery语言?我好奇。 –

10

这里缺少的关键是服务器端验证器必须实现IClientValidatable接口:

public class RateRequiredIfCustomIndexRateAttribute : ValidationAttribute, IClientValidatable 
{ 
    public override bool IsValid(object value) 
    { 
     return false; 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     yield return new ModelClientValidationRule 
     { 
      ErrorMessage = this.ErrorMessage, 
      ValidationType = "raterequiredifcustomindexrate" 
     }; 
    } 
} 

一旦你这样做,客户端验证应该正确地连接起来。您可以通过确保您的输入字段具有属性“data-val-raterequiredifcustomindexrate”属性来验证此情况。