Пользовательские аннотации данных и проверка на стороне клиента MVC2 - PullRequest
1 голос
/ 04 июля 2011

В моей модели представления есть свойство, представляющее собой пользовательский класс со свойством value.

, например

class mycustomobj
{ 
     public int? Value {get; set; } 
}

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

У меня есть настраиваемый атрибут диапазона DefaultablePercentRange , которым я украшаю это свойство, чтобы можно было проверить входные данные. С этим связан соответствующий валидатор 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.Value, а не просто mycustomobj. Таким образом, свойство view в html оказывается примерно таким:

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

Теперь моя проблема в том, что валидация javascript передает null в мою функцию проверки на стороне клиента. После значительного количества исследований я обнаружил, что это происходит потому, что JSON, созданный для моего пользовательского DataAnnotationsModelValidator, не использует полный идентификатор свойства. Например, созданный 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": "mycustomobj_value_validationMessage", "ValidationRules": [{"ErrorMessage": "Это значение должно быть в диапазоне 0 - 100Parameters, Valid ": {" минимум ": 0," максимум ": 100}," ValidationType ":" defaultablePercentRange "}, {" ErrorMessage ":" Это значение должно находиться в диапазоне 0 - 100 "," ValidationParameters ": {" минимум ": 0," максимум ": 100}," ValidationType ":" defaultablePercentRange "}]} * +1021 *

Мой вопрос Как я могу получить правильное имя свойства, сериализованное для проверки на стороне клиента, чтобы моя проверка на стороне клиента работала. Мой сервер работает нормально.

Пожалуйста, дайте мне знать, если кому-то нужна дополнительная информация.

1 Ответ

0 голосов
/ 12 июля 2011

В итоге я справился с этим, используя комбинацию факторов.

  • Создано связующее для моделей специально для mycustomobj, которое знает, как установить значение для mycustomobj
  • изменил шаблон, так что .Value было выведено, но имя элемента управления было просто именем свойства

Это означало, что при привязке к viewmodel в сообщении я могу убедиться, что на mycustomobj установлено правильное свойство. И в javascript код проверки клиента javascript вызывался надлежащим образом, так как был установлен правильный идентификатор ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...