客户端验证不适用于一个非常简单的示例

时间:2012-03-24 10:40:54

标签: asp.net-mvc

我尝试在一个非常简单的示例中使用客户端验证,但它不起作用。我从互联网上的一个现有例子开始。

这是(见接受的答案):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函数来检查信用卡!

我还是迷路了。

2 个答案:

答案 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; }

现在,您将获得自动客户端和服务器端验证。