Форма будет опубликована, когда вы используете 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.
Надеюсь, это поможет.