Почему не работает пользовательская проверка? - PullRequest
1 голос
/ 06 января 2012

ASP.NET MVC3 / Razor newbie question:

Я настраиваю модель с пользовательской проверкой.Хотя свойства, которые я украшаю такими вещами, как [Required] и [RegularExpression(...)], работают должным образом, я обнаружил, что пользовательская проверка не работает.Я заставил мою модель реализовать IValidatableObject, и я могу достичь точки останова внутри метода Validate() и посмотреть, как метод выполняет yield return new ValidationResult(...); - но форма тем не менее публикуется.Я скучаю?

Ответы [ 2 ]

2 голосов
/ 06 января 2012

Если вы говорите о проверке на стороне сервера, у вас есть проверка ModelState.Isvalid?http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

1 голос
/ 06 января 2012

Форма будет опубликована, когда вы используете IValidatableObject для проверки свойств модели.Как говорит Джори Джанс, вы все еще можете это предотвратить и вернуть страницу пользователю во время действия вашего метода:

public ActionResult MyAction(MyModel model)
{
    if (ModelState.IsValid)
    {
        // code to perform action when input is valid
        return [return something]
    }
    return View(model); // re-display form because ModelState.IsValid == false
}

Если вы хотите, чтобы ваша пользовательская проверка не позволяла опубликовать форму, вам нужно подтвердить ее наклиент.Самый простой способ сделать это с помощью RemoteAttribute.

public class MyModel
{
    [Remote("MyValidateAction", "MyController", HttpMethod = "POST")]
    public string MyProperty { get; set; }
}

Вы по-прежнему можете хранить свой код в IValidatableObject и проверять его с помощью метода действия, например:

[HttpPost]
public virtual JsonResult MyValidateAction(string myProperty)
{
    var model = new MyModel{ MyProperty = myProperty, };
    var results = new List<ValidationResult>();
    var isValid = Validator.TryValidateObject(model, 
        new ValidationContext(model, null, null), results, true);
    return isValid
        ? Json(true)
        : Json(results[0].ErrorMessage);
}

Вышеуказанный метод действия делает практически то же самое, что и модель по умолчанию.связующее.Он создает экземпляр вашей модели представления, а затем проверяет его.Будут проверены все правила проверки, включая ваш код IValidatableObject.Если вам нужно отправить дополнительные свойства в метод действия для создания вашей модели представления, вы можете сделать это с помощью свойства AdditionalFields объекта RemoteAttribute.

Надеюсь, это поможет.

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