MVC 5 IValidatableObject не отображает сообщение об ошибке?

#c# #.net #asp.net-mvc #validation #asp.net-mvc-5

#c# #.net #asp.net-mvc #проверка #asp.net-mvc-5

Вопрос:

Я следую за блогом ScottGus здесь — Основное требование, которое у меня есть, это то, что у меня есть два текстовых поля на экране — я хочу проверить, являются ли оба они пустыми и нажата кнопка Sumite, которую я хочу отобразить для использования, требуется одно или другое

У меня есть пользовательская модель, как показано ниже:

 public class UserViewModel : IValidatableObject
{
    [Display(Name = "Name:")]
    public string UserName { get; set; }

    [Display(Name = "User Account Number:")]
    public string UserAccountNumber { get; set; }

    public bool UserHasName()
    {
        return !string.IsNullOrEmpty(UserName);
    }

    public bool UserHasAccountNumber()
    {
        return !string.IsNullOrEmpty(UserAccountNumber);
    }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (!UserHasName() amp;amp; !UserHasAccountNumber())
        {
            yield return new ValidationResult("Please enter an Account Number or Name ", new [] {"UserName"});
        }
    }
}
  

На мой взгляд, у меня есть:

   @Html.TextBoxFor(m => m.UserName, new { @class = "form-control", @placeholder = "UserName" })
                    @Html.ValidationMessageFor(m => m.UserName)
  

В Webconfig у меня есть следующее :

 <add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
  

Однако, когда я нажимаю кнопку отправки с пустыми обоими полями, на экране не отображается сообщение об ошибке?

Обновить

В конфигурации пакета я также использую jQuery.validate.unobtrusive:

  bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                        "~/Scripts/jquery-{version}.js",
                        "~/Scripts/jquery.validate.js",
                        "~/Scripts/jquery.validate.unobtrusive.js"));
  

Хотя впоследствии я включаю js для bootstrap и kendo ui — может ли это вызвать какой-то конфликт?

Обновлены два

Код контроллера:

 public ActionResult UserDetails()
    {
        if (ModelState.IsValid)
        {
            // IsValid is true so code goes in here when text fields are blank??
            //redirect to another view
        }

        return View();
    }
  

У меня действительно есть класс JsonValididationFilterAttribute — код, как показано ниже — хотя, как я уже сказал, по какой-то причине точка останова при проверке или это OnActionExecuting не выполняется?

     public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (actionContext.ModelState.IsValid) return;
        var errorMessages = actionContext.ModelState.Values
            .SelectMany(modelState => modelState.Errors);
        actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, Json.Encode(errorMessages));
    }
  

Комментарии:

1. Вы проверяете свою модель (ModelState. Является ли значение VALID) в контроллере?

2. @idlerboris — да, я проверяю ModelState. isValid — однако при отправке формы с пустыми полями в точке останова значение isValid равно true, а также, если я установлю точку останова в методе Validate в ViewModel, она не попадет?

3. Можете ли вы прикрепить код вашего контроллера?

4. Используете ли вы пользовательский modelbinder?

5. @idlerboris — вопрос снова обновлен

Ответ №1:

Я думаю, вам следует вставить параметр в свой метод action, вот так:

 public ActionResult UserDetails(UserViewModel model)
  

В противном случае MVC не понял, что вы хотите вызвать Validate для этой модели.

Ответ №2:

Возможно, вам понадобится дополнительный javascript:

включить jquery.unobtrusive-ajax.js файл.

 <script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
  

Вы можете найти его в NuGet Packages: Microsoft.jQuery.Unobtrusive.Ajax .