Проверка MVC 3 - показывать только сообщения об ошибках после потери фокуса или отправки? - PullRequest
3 голосов
/ 19 мая 2011

Я настроил сущности в своем приложении MVC 3 с помощью DataAnnotations (обязательно, длина строки и т. Д.), И на странице MVC отображаются сообщения об ошибках проверки.Но сообщения об ошибках отображаются, как только страница загружается в новую форму, прежде чем пользователь сможет ввести недопустимое значение.

Я использовал проверку JQuery несколько лет назад и смог отображать сообщения об ошибках только после того, как пользователь потерял фокус на поле или попытался отправить форму.На самом деле, я думаю, что это было поведение по умолчанию.

Есть ли в любом случае сделать то же самое в MVC 3 с использованием DataAnnotations?

РЕДАКТИРОВАТЬ: Вот HTML

<div class="form horizontal floated w50p">
<h3>Billing Information</h3>
@using(Html.BeginForm()){
    <div class="item">
        <div class="label">
            <label>* First Name</label></div>
        <div class="value">@Html.TextBoxFor(x => x.Name)</div>
        <div class="value">@Html.ValidationMessageFor(x => x.Name)</div>
    </div>
    <div class="item">
        <div class="label">
            <label>* Address 1</label></div>
        <div class="value">@Html.TextBoxFor(x => x.Street1)</div>
        <div class="value">@Html.ValidationMessageFor(x => x.Street1)</div>
    </div>
    <div class="item">
        <div class="label">
            <label>Address 2</label></div>
        <div class="value">@Html.TextBoxFor(x => x.Street2)</div>
    </div>
    <div class="item">
        <div class="label">
            <label>Address 3</label></div>
        <div class="value">@Html.TextBoxFor(x => x.Street3)</div>
    </div>
    <div class="item">
        <div class="label">
            <label>City</label></div>
        <div class="value">@Html.TextBoxFor(x => x.City)</div>
        <div class="value">@Html.ValidationMessageFor(x => x.City)</div>
    </div>
    <div class="item">
        <div class="label">
            <label>State/Province/Region</label></div>
        <div class="value">@Html.TextBoxFor(x => x.StateProv)</div>
        <div class="value">@Html.ValidationMessageFor(x => x.StateProv)</div>
    </div>
    <div class="item">
        <div class="label">
            <label>Zip / Postal Code</label></div>
        <div class="value">@Html.TextBoxFor(x => x.PostalCode)</div>
        <div class="value">@Html.ValidationMessageFor(x => x.PostalCode)</div>
    </div>
    <div class="item">
        <div class="label">
            <label>* Contact Phone</label></div>
        <div class="value">@Html.TextBoxFor(x => x.ContactPhone)</div>
        <div class="value">@Html.ValidationMessageFor(x => x.ContactPhone)</div>
    </div>        <input type="submit" value="Submit" />
}

Ответы [ 2 ]

4 голосов
/ 19 мая 2011

Поведение по умолчанию - именно то, что вы описываете (ошибки должны появляться только после того, как поле теряет фокус или отправляется форма).Итак, должно быть что-то не так с вашим взглядом или контроллером.В частности, это звучит так, будто валидатор считает, что пользователь отправляет сообщения даже при первом просмотре формы.Первый вид формы должен быть GET, а не POST.Если вы вставите код контроллера, это поможет нам лучше его диагностировать.

3 голосов
/ 19 мая 2011

Вы имеете в виду, как включить проверку клиента? Конечно, это легко. Просто:

  1. создать модель представления
  2. украсить его
  3. создать контроллер
  4. создать вид
  5. включает правильные скрипты jquery

Итак, давайте продолжим и выполните эти шаги.

Посмотреть модель:

public class ProductViewModel
{
    [Required] // <-- you could use any data annotation attributes you like
    public string Name { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new ProductViewModel();
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(ProductViewModel model)
    {
        return View(model);
    }
}

Вид:

@model ProductViewModel

<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>

@using (Html.BeginForm())
{
    @Html.LabelFor(x => x.Name)
    @Html.EditorFor(x => x.Name)
    @Html.ValidationMessageFor(x => x.Name)
    <input type="search" value="OK" />
}

Теперь оставьте поле пустым, и проверка клиента сработает при условии, что он включен в web.config (что по умолчанию используется при создании нового проекта ASP.NET MVC 3 с использованием шаблона Visual Studio по умолчанию):

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

Если вы хотите обрабатывать пользовательские атрибуты проверки, вы можете, но это может быть немного более болезненным . И как только вы познакомитесь с реальными приложениями и поймете недостатки декларативной проверки с использованием атрибутов (аннотаций данных), я настоятельно рекомендую вам проверить FluentValidation.NET .

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