自定义数据注释和客户端验证MVC2

本文关键字:验证 MVC2 客户端 数据 注释 自定义 | 更新日期: 2023-09-27 18:01:09

我的视图模型上有一个属性,它是一个具有值属性的自定义类。

例如

class mycustomobj
{ 
     public int? Value {get; set; } 
}
public class myviewmodel
{
    [DefaultablePercentRange]
    public property mycustomobj { get; set; }
}

我有一个自定义范围属性DefaultablePercentRange,我用它来装饰这个属性,以便检查appropiate输入。与此相关的是客户端的相关javascript验证器。

javascript是:

Sys.Mvc.ValidatorRegistry.validators["defaultablePercentRange"] = function (rule) {
var _minimum = rule.ValidationParameters["minimum"];
var _maximum = rule.ValidationParameters["maximum"];
return function (value, context) {
    if (!value || !value.length) {
        return true; // return true as null values allowed
    }
    var n = Number.parseLocale(value);
    return (!isNaN(n) && _minimum <= n && n <= _maximum);
};

}

我还在带有模板的视图中使用Html.EditorFor,这样我就可以将属性输出为mycustomobj。值,而不仅仅是mycustomobj。因此,html中的view属性最终被呈现为类似于:

<input class="defaultable tiny" default="0" defaultwhen="0" id="mycustomobj_Value" name="mycustomobj.Value" type="text" value="" placeholder="0" style="">

现在我的问题是javascript验证正在将null传递到我的客户端验证器函数中。经过大量的调查,我发现这是因为为我的自定义DataAnnotationsModelValidator创建的JSON没有使用该属性的完整id。例如,创建的JSON是:

{"FieldName":"mycustomobj","ReplaceValidationMessageContents":true,"ValidationMessageId":"mycustomobj_validationMessage","ValidationRules":[{"ErrorMessage":"This value must be in the range 0 - 100","ValidationParameters":{"minimum":0,"maximum":100},"ValidationType":"defaultablePercentRange"},{"ErrorMessage":"This value must be in the range 0 - 100","ValidationParameters":{"minimum":0,"maximum":100},"ValidationType":"defaultablePercentRange"}]}

我需要的地方:{"FieldName":"mycustomobj.value","ReplaceValidationMessageContents":true,"ValidationMessageId":"my customobj_value_validationMessage","Validation Rules":[{"ErrorMessage":"此值必须在0-100范围内","验证参数":{"最小值":0,"最大值":100},"验证类型":"defaultablePercentRange"},{,"maximum":100},"ValidationType":"defaultablePercentRange"}]}

我的问题是。我如何才能为客户端验证序列化正确的属性名称,以便我的客户端验证能够工作。我的服务器端工作得很好。

如果有人需要更多信息,请告诉我。

自定义数据注释和客户端验证MVC2

我最终通过使用多种因素来解决这个问题。

  • 专门为mycustomobj创建了一个模型绑定器,该绑定器知道如何设置mycustomoj的值
  • 更改了模板,因此输出了.Value,但控件名称仍然只是属性名称

这意味着当在post上绑定回viewmodel时,我可以确保mycustomobj上设置了正确的属性。在javascript中,javascript客户端验证代码被适当地调用,因为设置了正确的输入id。