我尝试在一个非常简单的示例中使用客户端验证,但它不起作用。我从互联网上的一个现有例子开始。
这是(见接受的答案):ASP .Net MVC 3 unobtrusive custom client validation
基本上,它使用此博客作为解决方案:http://benjii.me/2010/11/credit-card-validator-attribute-for-asp-net-mvc-3/
所以我从一个空白的解决方案开始,并想验证价格是否大于最低价格。
我的控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(MinPriceViewModel model)
{
if (!ModelState.IsValid)
return View(model);
return Content("Thank you very much");
}
}
我的观点模型:
public class MinPriceViewModel
{
[MinPrice(MinPrice=9.99)]
[Required]
public double Price { get; set; }
}
验证属性(客户端和服务器):
public class MinPriceAttribute : ValidationAttribute, IClientValidatable
{
public double MinPrice { get; set; }
public override bool IsValid(object value)
{
if (value == null)
return true;
var price = Convert.ToDouble(value);
if (price < MinPrice)
{
return false;
}
return true;
}
public override string FormatErrorMessage(string name)
{
return "Attention le champ " + name + " ne contient pas un prix acceptable.";
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage,
ValidationType = "minprice"
};
}
}
观点:
@model MinPriceValidation.Models.MinPriceViewModel
@{
ViewBag.Title = "Home Page";
}
<script src="../../Scripts/jquery.validate.js" type="text/javascript"></script>
<script src="../../Scripts/jquery.validate.unobtrusive.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
jQuery.validator.unobtrusive.adapters.addBool('minprice');
});
</script>
@using(Html.BeginForm())
{
@Html.LabelFor(m => m.Price)
@Html.TextBoxFor(m => m.Price)
@Html.ValidationMessageFor(m => m.Price)
<input type = submit />
}
我在我的控制器中的post post上放置了一个断点,以检查是否发生了客户端或服务器验证。当我运行解决方案并输入1并提交时,在我的控制器中达到了断点(后期操作)&gt;&gt;我总结说客户端验证从未使用过。
我不理解,因为我从基本示例(信用卡验证)开始,我知道此信用卡验证在客户端验证中工作(我在其他解决方案中测试过)。
我有点失落。
知道为什么客户端验证不起作用吗?
感谢。
更新
经过google搜索后,我发现有些人告诉我们需要一个javascript函数来进行客户端验证,如下所示:
jQuery.validator.addMethod("minprice", function (value, element, param) {
// Perform tests here for client validation
return (value>10);
});
jQuery.validator.unobtrusive.adapters.addBool('minprice');
当我使用这个添加的javascript函数进行测试时,它可以正常工作但我觉得奇怪的是,creait卡示例在视图中没有任何javascript函数来检查信用卡!
我还是迷路了。
答案 0 :(得分:1)
确保在web.config中使用这些设置:
<appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
此脚本包含在页面中:
<script src="@Url.Content("~/Scripts/jquery-1.5.1.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>
答案 1 :(得分:1)
当你说你看到有人用信用卡使用它时,它可以在不需要自定义javascript功能的情况下工作,我想你是在考虑following post。
credit card validation rule直接构建在jquery validate插件中。这就是您不需要编写自定义验证功能的原因。
就minprice
规则而言,没有这样的事情,所以你需要编写一个自定义的javascript函数来定义minprice
的含义。
这就是说我觉得你正在用这个属性重新发明一些轮子,你可以这样做:
[Range(9.99, double.MaxValue)]
[Required]
public double Price { get; set; }
由于我们在讨论价格,建议在您的模型上使用小数类型:
[Range(9.99, double.MaxValue)]
[Required]
public decimal Price { get; set; }
现在,您将获得自动客户端和服务器端验证。