Является ли DataTypeAttribute на модели действительностью в MVC 3?
Шаблон интернет-приложения 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; }
}
В действии Account/Register запрашивается адрес электронной почты, но, похоже, вы можете ввести что-либо в этом поле и оно примет его.
Является ли метод DataType (DataType.EmailAddress) инициировать проверку? Кажется, что нет. Если он не подтверждает тип, то какова его цель?
Ответы
Ответ 1
Насколько мне известно, атрибут 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:
Может быть какая-то проверка, прикрепленная к ним, но только с клиентской стороны. Не полагайтесь на эти атрибуты для фактической проверки, это всегда должно выполняться на стороне сервера (клиентская сторона предназначена только для пользователей)
Ответ 2
В текущей версии MVC3 отсутствует проверка, связанная с атрибутами DataType. Новые атрибуты, полученные из этого атрибута, отображаются в MVC Futures и добавляют этот процесс проверки. (EmailAdressAttribute для примера)
Ответ 3
Шаблон по умолчанию не добавляет правильные сценарии Validate.js на главную страницу. Аннотации данных просто выводят HTML, который читает javascript для проверки на стороне клиента.
В действии вашего контроллера вам нужно сделать Model.IsValid, чтобы убедиться в правильности серверной проверки.
Ответ 4
Я не мог заставить этот валидатор работать и в итоге написал свой собственный, похожий на один, найденный на сайте ASP.net. Предположительно, в MVC3 Future доступна аннотация [EmailAddress].
Ответ 5
Атрибуты DataType используются шаблонами при использовании редактора()
Ответ 6
Атрибуты DataType не являются атрибутами проверки. Они используются для шаблонов. ех. вы можете использовать тег html 5 для DataType.Email. JakeJ подробно описал это.