Атрибут DataTypeAttribute в модели выполняет проверку в MVC 3? - PullRequest
13 голосов
/ 01 июля 2011

Шаблон интернет-приложения ASP.net MVC 3 по умолчанию включает следующую модель:

public class RegisterModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

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

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

В действии Аккаунт / Регистрация он запрашивает адрес электронной почты, но, похоже, вы можете ввести что-нибудь в это поле, и он примет его.

Действительно ли DataType (DataType.EmailAddress) запускает проверку? Кажется, что нет. Если он не проверяет тип, тогда какова его цель?

Ответы [ 6 ]

11 голосов
/ 18 апреля 2012

Насколько я знаю, атрибут DataType используется для форматирования, но только когда вы используете @Html.EditorFor(model => model.Field).

Примеры из полей модели, cshtml и полученного HTML:

Поля модели:

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

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

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

Cshtml:

<div class="form-section">
    @Html.LabelFor(x => x.Name)
    @Html.EditorFor(x => x.Name)
</div>

<div class="form-section">
    @Html.LabelFor(x => x.Password)
    @Html.EditorFor(x => x.Password)
</div>

<div class="form-section">
    @Html.LabelFor(x => x.Desc)
    @Html.EditorFor(x => x.Desc)
</div>

Результирующий HTML:

<div class="form-section">
    <label for="Name">Name</label>
    <input class="text-box single-line" id="Name" name="Name" type="text" value="">
</div>
<div class="form-section">
    <label for="Password">Password</label>
    <input class="text-box single-line password" id="Password" name="Password" type="password" value="">
</div>
<div class="form-section">
    <label for="Desc">Description</label>
    <textarea class="text-box multi-line" id="Desc" name="Desc"></textarea>
</div>

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

EDIT:

Там может быть некоторая проверка, прикрепленная к этим, но только на стороне клиента. Не полагайтесь на эти атрибуты для фактической проверки, это всегда должно выполняться на стороне сервера (на стороне клиента только для удобства пользователя)

3 голосов
/ 03 апреля 2012

В текущем выпуске MVC3 нет проверки, связанной с атрибутами DataType.Новые атрибуты, полученные из этого атрибута, отображаются в MVC Futures и добавляют этот процесс проверки.(EmailAdressAttribute для примера)

0 голосов
/ 22 апреля 2012

Атрибуты DataType не являются атрибутами проверки. Они используются для шаблонов. ех. Вы можете использовать тег электронной почты html 5 для DataType.Email. Джейк подробно рассказал.

0 голосов
/ 21 апреля 2012

Атрибуты DataType используются шаблонными представлениями при использовании editorfor ()

0 голосов
/ 01 июля 2011

Я тоже не смог заставить этот валидатор работать и в итоге написал свой собственный аналог , найденный на сайте ASP.net . Предположительно, в будущем MVC3 доступна аннотация [EmailAddress].

0 голосов
/ 01 июля 2011

Шаблон по умолчанию не добавляет надлежащие сценарии Validate.js на главную страницу. Аннотации данных просто выводят HTML, который JavaScript читает для проверки на стороне клиента.

В вашем действии контроллера вам нужно сделать Model.IsValid для проверки на стороне сервера.

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