Валидация модели с помощью dataannotation

169
18 июля 2019, 21:00

Пытаюсь повесить на модель валидацию. Вот моя модель:

public class Client
{
    public int Id { get; set; }
    [Required]
    public string CSurname { get; set; }
    [Required]
    public string CName { get; set; }
    [Required]
    public string CPatronymic { get; set; }
    [Required]
    public string Login { get; set; }
    [Required]
    public string Password { get; set; }
    [Required]
    public string Email { get; set; }
    public virtual ICollection<Order> Orders { get; set; }
    public Client()
    {
        Orders = new List<Order>();
    }
}

Все поля в ней обязательны. При регистрации специально не ввожу например фамилию. Но сообщения об ошибке не следует на view. Вот код:

View:

<div class="container">
    <div class="form-signin">
        <div class="form-group">
            @Html.LabelFor(i => i.CSurname, "Фамилия")
            <div class="cols-sm-10">
                <div class="input-group">
                    <span class="input-group-text"><i class="fa fa-id-badge" aria-hidden="true"></i></span>
                    @Html.EditorFor(i => i.CSurname, new { htmlAttributes = new { @id = "txtSurname", @class = "form-control", @placeholder = "Введите фамилию" } })
                    @Html.ValidationMessageFor(i => i.CSurname, null, new { @class = "text-danger" })
                </div>
            </div>
        </div>

Controller:

[HttpPost]
public ActionResult Registration(Client client)
{
    if (ModelState.IsValid)
    {
        RedirectToAction("Index");
    }
    return View();
}

Хотя когда смотришь в отладке. Условие false. Лезу внутрь ModelState нахожу там error и его текст, но почему то на view он не выводиться. В чём может быть дело?

Вот весь код view:

@model AutoStore.Domain.Core.Client
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />
<style>
    html,
    body {
        height: 100%;
    }
    body {
        display: -ms-flexbox;
        display: flex;
        -ms-flex-align: center;
        align-items: center;
        padding-top: 40px;
        padding-bottom: 40px;
    }
    .form-signin {
        width: 100%;
        max-width: 330px;
        padding: 15px;
        margin: auto;
    }
    .input-group-text {
        border-top-left-radius: 30px;
        border-bottom-left-radius: 30px;
    }
    .form-control {
        border-radius: 30px;
    }
</style>
@Html.ActionLink("Главная", "Index")
@using (Html.BeginForm())
{
    <div class="container">
        <div class="form-signin">
            <div class="form-group">
                @Html.LabelFor(i => i.CSurname, "Фамилия")
                <div class="cols-sm-10">
                    <div class="input-group">
                        <span class="input-group-text"><i class="fa fa-id-badge" aria-hidden="true"></i></span>
                        @Html.EditorFor(i => i.CSurname, new { htmlAttributes = new { @id = "txtSurname", @class = "form-control", @placeholder = "Введите фамилию" } })
                    </div>
                    @Html.ValidationMessageFor(i => i.CSurname, "", new { @class = "text-danger" })
                </div>
            </div>
            <div class="form-group">
                @Html.LabelFor(i => i.CName, "Имя")
                <div class="cols-sm-10">
                    <div class="input-group">
                        <span class="input-group-text"><i class="fa fa-id-badge" aria-hidden="true"></i></span>
                        @Html.EditorFor(i => i.CName, new { htmlAttributes = new { @id = "txtName", @class = "form-control", @placeholder = "Введите имя" } })
                    </div>
                    @Html.ValidationMessageFor(i => i.CName, "", new { @class = "text-danger" })
                </div>
            </div>
            <div class="form-group">
                @Html.LabelFor(i => i.CPatronymic, "Отчество")
                <div class="cols-sm-10">
                    <div class="input-group">
                        <span class="input-group-text"><i class="fa fa-id-badge" aria-hidden="true"></i></span>
                        @Html.EditorFor(i => i.CPatronymic, new { htmlAttributes = new { @id = "txtPatr", @class = "form-control", @placeholder = "Введите отчество" } })
                    </div>
                    @Html.ValidationMessageFor(i => i.CPatronymic, "", new { @class = "text-danger" })
                </div>
            </div>
            <div class="form-group">
                @Html.LabelFor(i => i.Login, "Логин")
                <div class="cols-sm-10">
                    <div class="input-group">
                        <span class="input-group-text"><i class="fa fa-user fa" aria-hidden="true"></i></span>
                        @Html.EditorFor(i => i.Login, new { htmlAttributes = new { @id = "txtLogin", @class = "form-control", @placeholder = "Введите логин" } })
                    </div>
                    @Html.ValidationMessageFor(i => i.Login, "", new { @class = "text-danger" })
                </div>
            </div>
            <div class="form-group">
                @Html.LabelFor(i => i.Password, "Пароль")
                <div class="cols-sm-10">
                    <div class="input-group">
                        <span class="input-group-text"><i class="fa fa-lock fa" aria-hidden="true"></i></span>
                        @Html.PasswordFor(i => i.Password, new { @id = "txtPass", @class = "form-control", @placeholder = "Введите пароль" })
                    </div>
                    @Html.ValidationMessageFor(i => i.Password, "", new { @class = "text-danger" })
                </div>
            </div>
            <div class="form-group">
                @Html.LabelFor(i => i.Email, "E-Mail")
                <div class="cols-sm-10">
                    <div class="input-group">
                        <span class="input-group-text"><i class="fa fa-envelope fa" aria-hidden="true"></i></span>
                        @Html.EditorFor(i => i.Email, new { htmlAttributes = new { @id = "txtMail", @class = "form-control", @placeholder = "Введите e-mail", @type = "email" } })
                    </div>
                    @Html.ValidationMessageFor(i => i.Email, "", new { @class = "text-danger" })
                </div>
            </div>
            <input id="btnAdd" type="submit" class="btn btn-success btn-block" value="Добавить" />
        </div>
    </div>
}

А вот пример ошибки если в поле email нет @:

А при ajax запросе такого не происходит.

Скриншот:

READ ALSO
Binding не выводит свойство на Label

Binding не выводит свойство на Label

В окне есть Slider и Label

151
Проблема со SquishIt

Проблема со SquishIt

Вечер добрыйПомогите разобраться

239
c# масштабируемый график/рисунок/контрол

c# масштабируемый график/рисунок/контрол

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

150
Автоматический Dispose(); у всех полей класса

Автоматический Dispose(); у всех полей класса

На сколько НЕкоректно использовать такую вот "ленивую" конструкцию диспоуза:

142