обязательный атрибут не работает в asp.net mvc

У меня есть простое строго типизированное представление.

@model GoldForGold.Models.LogonModel
@{
    ViewBag.Title = "Logins";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

Logins
@using (Html.BeginForm()) {

Account Information
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName, new { id = "txtUserName" })
@Html.ValidationMessageFor(m => m.UserName)
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password, new { id = "txtPassword" })
@Html.ValidationMessageFor(m => m.Password)
@Html.CheckBoxFor(m => m.RememberMe)
@Html.LabelFor(m => m.RememberMe)

<input type="submit" value="Log On" onclick="getcredentials()" />
}

Код модели здесь.

public class LogonModel
{
    [Required(ErrorMessage="please enter username")]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

Я вижу, что ничего не происходит, даже когда я не ввожу имя пользователя и пароль.


person user2465036    schedule 01.11.2013    source источник
comment
Можете ли вы показать нам свой метод действия Post.   -  person WannaCSharp    schedule 02.11.2013


Ответы (7)


Для проверки на стороне клиента вам нужна проверка jquery и jquery.

после этого проверка на стороне клиента должна быть включена в конфигурации:

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

для проверки на стороне сервера вы можете проверить состояние проверки с помощью:

ModelState.IsValid;
person MRB    schedule 01.11.2013
comment
У меня был этот набор, но он побудил меня пересмотреть мои включения. не включал query.validate.min.js или jquery.validate.unobtrusive.min.js. ошибка новичка. - person ransems; 14.08.2020

Вот полное решение:

  1. Добавьте в представление следующие скрипты:

    <script src='@Url.Content("~/Scripts/jquery-1.8.2.js")' type='text/javascript'></script>    
    <script src='@Url.Content("~/Scripts/jquery.validate.js")' type='text/javascript'>         </script>
    <script src='@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")' type='text/javascript'></script>
    
  2. Включите проверку в Web.Config:

    <appSettings>
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    </appSettings>
    
  3. Добавьте элемент проверки в представление:

    @Html.ValidationMessageFor(model => model.UserName)
    
  4. Добавьте атрибут Required к элементу вашей модели.

    [Required(ErrorMessage="please enter username")]
    public string UserName { get; set; }
    
person Vahagn Nahapetyan    schedule 11.02.2014

Для записи вы можете включить следующий код в конце вашего представления, чтобы убедиться, что атрибут [Required] появляется в пользовательском интерфейсе:

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
person Cosmin Cretu    schedule 12.02.2016

Еще одна вещь, с которой следует быть осторожным при использовании [Required], — это использование его в целочисленном поле, а не только при сохранении числового значения, но также, скажем, при сохранении идентификатора выбранного значения раскрывающегося списка/выбора.

[Required] не будет работать в этой ситуации, потому что целочисленное свойство никогда не может быть нулевым и поэтому всегда имеет значение по умолчанию, равное нулю. [Required] проверяет, что свойство имеет значение, а нуль считается значением, поэтому проверка пройдет.

В этом случае либо объявите свойство как целое число nullable:

    [Required]
    public int? LanguageId { get; set; } // note the int is now nullable

или, альтернативно, используйте атрибут Range, чтобы ноль не был допустимым значением:

    [Range(1, int.MaxValue)]
    public int LanguageId { get; set; }
person tomRedox    schedule 31.01.2018
comment
Спасибо большое. ломал голову над этим! - person Tiki; 05.04.2019

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

using System.ComponentModel.DataAnnotations;

имейте в виду, что существует другое пространство имен (Microsoft.Build.Framework), которое также поддерживает аннотацию [Required].

person Ike    schedule 10.08.2019


  • Шаги для решения:

1- Добавьте скрипты для просмотра:

<script src='@Url.Content("~/Scripts/jquery-1.8.2.js")' type='text/javascript'></script>       
<script src='@Url.Content("~/Scripts/jquery.validate.js")' type='text/javascript'>         
</script>
<script src='@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")' type='text/javascript'></script>

2- Включите проверку в Web.Config:

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

3- Добавьте помощник проверки html в представление:

@Html.ValidationMessageFor(model => model.UserName)

4- Добавьте обязательный атрибут к элементу вашей модели:

[Required(ErrorMessage="please enter username")]
public string UserName { get; set; }
person Jehad87    schedule 12.02.2016
comment
Вы в основном скопировали ответ Ваагна Наапетяна. - person actaram; 26.05.2016