Поиск…


Вступление

Мы можем добавить подтверждение к нашему приложению, добавив аннотации данных к нашим классам моделей. Аннотации данных позволяют нам описывать правила, которые мы хотим применить к нашим свойствам модели, и ASP.NET MVC позаботится об их соблюдении и отображении соответствующих сообщений пользователям.

Основные атрибуты проверки, используемые в ViewModel

модель

using System.ComponentModel.DataAnnotations;

public class ViewModel
{
    [Required(ErrorMessage="Name is required")] 
    public string Name { get; set; }

    [StringLength(14, MinimumLength = 14, ErrorMessage = "Invalid Phone Number")]
    [Required(ErrorMessage="Phone Number is required")] 
    public string PhoneNo { get; set; }

    [Range(typeof(decimal), "0", "150")]
    public decimal? Age { get; set; }

    [RegularExpression(@"^\d{5}(-\d{4})?$", ErrorMessage = "Invalid Zip Code.")]
    public string ZipCode {get;set;}

    [EmailAddress(ErrorMessage = "Invalid Email Address")] 
    public string Email { get; set; }

    [Editable(false)] 
    public string Address{ get; set; }
}

Посмотреть

// Include Jquery and Unobstructive Js here for client side validation

@using (Html.BeginForm("Index","Home") { 

    @Html.TextBoxFor(model => model.Name) 
    @Html.ValidationMessageFor(model => model.Name)

    @Html.TextBoxFor(model => model.PhoneNo)
    @Html.ValidationMessageFor(model => model.PhoneNo)

    @Html.TextBoxFor(model => model.Age)
    @Html.ValidationMessageFor(model => model.Age)

    @Html.TextBoxFor(model => model.ZipCode)
    @Html.ValidationMessageFor(model => model.ZipCode)

    @Html.TextBoxFor(model => model.Email)
    @Html.ValidationMessageFor(model => model.Email)

    @Html.TextBoxFor(model => model.Address)
    @Html.ValidationMessageFor(model => model.Address)

    <input type="submit" value="submit" />
}

контроллер

public ActionResult Index(ViewModel _Model) 
{ 
    // Checking whether the Form posted is valid one. 
    if(ModelState.IsValid) 
    { 
        // your model is valid here.
        // perform any actions you need to, like database actions,
        // and/or redirecting to other controllers and actions.
    }
    else 
    {
        // redirect to same action
        return View(_Model);
    } 
}

Удаленная проверка

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

За работой

RemoteAttribute работает, создавая вызов AJAX от клиента к действию контроллера со значением проверяемого поля. Затем действие контроллера возвращает ответ JsonResult указывающий на успешность или неудачу проверки. Возврат true из вашего действия указывает на то, что проверка прошла. Любое другое значение указывает на сбой. Если вы возвращаете false , используется сообщение об ошибке, указанное в атрибуте. Если вы вернете что-либо еще, например строку или даже целое число, оно будет отображаться как сообщение об ошибке. Если вам не нужно, чтобы ваше сообщение об ошибке было динамическим, имеет смысл вернуть true или false и позволить валидатору использовать сообщение об ошибке, указанное в атрибуте.

ViewModel

public class ViewModel
{
    [Remote("IsEmailAvailable", "Group", HttpMethod = "POST", ErrorMessage = "Email already exists. Please enter a different email address.")]
    public string Email{ get; set; }
}

контроллер

[HttpPost]
public JsonResult IsEmailAvailable(string Email)
{
    // Logic to check whether email is already registered or Not.
    var emailExists = IsEmailRegistered();
    return Json(!emailExists);         
} 

Демо-скрипты

Вы можете передать дополнительные свойства модели методу контроллера с использованием свойства AdditionalFields для RemoteAttribute . Типичным сценарием было бы передать свойство ID модели в форме «Редактировать», чтобы логика контроллера могла игнорировать значения для существующей записи.

модель

  public int? ID { get; set; }
  [Display(Name = "Email address")]
  [DataType(DataType.EmailAddress)]
  [Required(ErrorMessage = "Please enter you email address")]
  [Remote("IsEmailAvailable", HttpMethod="Post", AdditionalFields="ID", ErrorMessage = "Email already exists. Please enter a different email address.")]  
  public string Email { get; set; }

контроллер

[HttpPost]
public ActionResult Validate(string email, int? id)
{
    if (id.HasValue)
    {
        return Json(!db.Users.Any(x => x.Email == email && x.ID != id);
    }
    else
    {
        return Json(!db.Users.Any(x => x.Email == email);
    }
}

Рабочая демонстрация - дополнительные поля

Дополнительная заметка

Сообщение об ошибке по умолчанию понятно неопределенное, поэтому всегда помните о том, чтобы переопределить сообщение об ошибке по умолчанию при использовании RemoteAttribute .

RequiredAttribute

Атрибут Required указывает, что требуется свойство. Сообщение об ошибке может быть указано при использовании свойства ErrorMessage в атрибуте.

Сначала добавьте пространство имен:

using System.ComponentModel.DataAnnotations;

И примените атрибут к свойству.

public class Product
{
   [Required(ErrorMessage = "The product name is required.")]
   public string Name { get; set; }

   [Required(ErrorMessage = "The product description is required.")]
   public string Description { get; set; }
}

Также возможно использовать ресурсы в сообщении об ошибке для глобализованных приложений. В этом случае ErrorMessageResourceName должен быть указан с помощью ключа ресурса класса ресурса ( resx файл) , который должен быть выставиться на ErrorMessageResourceType :

public class Product
{
   [Required(ErrorMessageResourceName = "ProductNameRequired", 
             ErrorMessageResourceType = typeof(ResourceClass))]
   public string Name { get; set; }

   [Required(ErrorMessageResourceName = "ProductDescriptionRequired", 
             ErrorMessageResourceType = typeof(ResourceClass))]
   public string Description { get; set; }
}

StringLengthAttribute

StringLength определяет минимальную и максимальную длину символов, разрешенных в поле данных. Этот атрибут можно применять к свойствам, общедоступным полям и параметрам. Сообщение об ошибке должно быть указано в ErrorMessage атрибута. Свойства MinimumLength и MaximumLength минимальные и максимальные значения соответственно.

Сначала добавьте пространство имен:

using System.ComponentModel.DataAnnotations;

И примените атрибут к свойству.

public class User
{
   // set the maximum
   [StringLength(20, ErrorMessage = "The username cannot exceed 20 characters. ")]
   public string Username { get; set; }

   [StringLength(MinimumLength = 3, MaximumLength = 16, ErrorMessage = "The password must have between 3 and 16 characters.")]        
   public string Password { get; set; }
}

Также возможно использовать ресурсы в сообщении об ошибке для глобализованных приложений. В этом случае ErrorMessageResourceName должен быть указан с помощью ключа ресурса класса ресурса ( resx файл) , который должен быть выставиться на ErrorMessageResourceType :

public class User
{
   [StringLength(20, ErrorMessageResourceName = "StringLength", 
                              ErrorMessageResourceType = typeof(ResoucesKeys))]        
   public string Username { get; set; }

   [StringLength(MinimumLength = 3, 
                        MaximumLength = 16, 
                        ErrorMessageResourceName = "StringLength", 
                        ErrorMessageResourceType = typeof(ResoucesKeys))]        
   public string Password { get; set; }
}

Атрибут диапазона

Атрибут Range может украшать любые свойства или публичные поля и задает диапазон, в котором числовое поле должно находиться между считанными действительными.

[Range(minimumValue, maximumValue)]
public int Property { get; set; }

Кроме того, он принимает необязательное свойство ErrorMessage которое может использоваться для установки сообщения, полученного пользователем при вводе неверных данных:

[Range(minimumValue, maximumValue, ErrorMessage = "{your-error-message}")]
public int Property { get; set; }

пример

[Range(1,100, ErrorMessage = "Ranking must be between 1 and 100.")]
public int Ranking { get; set; }

Атрибут RegularExpression

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

[RegularExpression(validationExpression)]
public string Property { get; set; }

Кроме того, он принимает необязательное свойство ErrorMessage которое может использоваться для установки сообщения, полученного пользователем при вводе неверных данных:

[RegularExpression(validationExpression, ErrorMessage = "{your-error-message}")]
public string Property { get; set; }

Примеры)

[RegularExpression(@"^[a-z]{8,16}?$", ErrorMessage = "A User Name must consist of 8-16 lowercase letters")]
public string UserName{ get; set; }
[RegularExpression(@"^\d{5}(-\d{4})?$", ErrorMessage = "Please enter a valid ZIP Code (e.g. 12345, 12345-1234)")]
public string ZipCode { get; set; }

Сравнить атрибут

Атрибут Compare сравнивает два свойства модели.

Сообщение об ошибке можно указать с помощью свойства ErrorMessage или с использованием файлов ресурсов.

Для использования атрибута Compare using для следующего пространства имен:

using System.ComponentModel.DataAnnotations;

Затем вы можете использовать атрибут в своей модели:

public class RegisterModel
{
    public string Email { get; set; }

    [Compare("Email",  ErrorMessage = "The Email and Confirm Email fields do not match.")]
    public string ConfirmEmail { get; set; }
}

Когда эта модель проверяется, если Email и ConfirmEmail имеют разные значения, проверка не завершится.

Локализованные сообщения об ошибках

Как и все атрибуты проверки, можно использовать сообщения об ошибках из файлов ресурсов. В этом примере сообщение об ошибке будет загружено из файла Resources , имя ресурса - CompareValidationMessage :

public class RegisterModel
{
    public string Email { get; set; }

    ["Email", ErrorMessageResourceType = typeof(Resources),  ErrorMessageResourceName = "CompareValidationMessage")]
    public string ConfirmEmail { get; set; }
}

Избегайте строк в именах свойств

Чтобы избежать использования строки для значения свойства, в C # 6+ вы можете использовать ключевое слово nameof :

public class RegisterModel
{
    public string Email { get; set; }

    [Compare(nameof(Email),  ErrorMessage = "The Email and Confirm Email fields do not match.")]
    public string ConfirmEmail { get; set; }
}

Заполнитель в сообщениях об ошибках

Вы можете использовать заполнители в сообщениях об ошибках. Placeholder {0} заменяется отображаемым именем текущего свойства, а {1} заменяется отображаемым именем связанного свойства:

public class RegisterModel
{
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Display(Name = "Confirm Email")]
    [Compare("Email",  ErrorMessage = "The '{1}' and '{0}' fields do not match.")]
    public string ConfirmEmail { get; set; }
}

Если проверка модели не выполняется, сообщение об ошибке будет

Поля «Электронная почта» и «Подтверждение электронной почты» не совпадают.

Пользовательский атрибут проверки

Когда дело доходит до проверки некоторых правил, которые не являются общей проверкой данных, например, если требуется поле или какой-либо диапазон значений, но они специфичны для вашей бизнес-логики, тогда вы можете создать свой собственный пользовательский валидатор . Чтобы создать собственный атрибут проверки, вам просто нужно inherit класс ValidationAttribute и override его IsValid . Метод IsValid принимает два параметра, первый - object именем как value а второй - ValidationContext object называемый validationContext . Value относится к фактическому значению из поля, которое ваш пользовательский валидатор собирается проверить.

Предположим, вы хотите проверить Email через Custom Validator

public class MyCustomValidator : ValidationAttribute
{
    private static string myEmail= "[email protected]";

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        string Email = value.ToString();
        if(myEmail.Equals(Email))
            return new ValidationResult("Email Already Exist");
        return ValidationResult.Success;
    }
}

public class SampleViewModel
{
    [MyCustomValidator]
    [Required]
    public string Email { get; set; }

    public string Name { get; set; }
}

Вот его демо-версия DotNetFiddle

Модель EDMx - аннотация данных

Модельный ряд Edmx

public partial class ItemRequest
{
    public int RequestId { get; set; }
    //...
}

Добавление аннотации данных к этому - если мы модифицируем эту модель напрямую, когда будет произведено обновление модели, изменения будут потеряны. так

Чтобы добавить атрибут в этом случае «Обязательный»,

Создать новый класс - любое имя. Тогда

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

//make sure the namespace is equal to the other partial class ItemRequest
namespace MvcApplication1.Models 
{
    [MetadataType(typeof(ItemRequestMetaData))]
    public partial class ItemRequest
    {
    }

    public class ItemRequestMetaData
    {
        [Required]
        public int RequestId {get;set;}

        //...
    }
}

или же

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace YourApplication.Models
{
    public interface IEntityMetadata
    {
        [Required]
        Int32 Id { get; set; }
    }

    [MetadataType(typeof(IEntityMetadata))]
    public partial class Entity : IEntityMetadata
    {
        /* Id property has already existed in the mapped class */
    }
}

Аннотации данных для первой реализации базы данных (автоматический код модели)

[MetadataType(typeof(RoleMetaData))]
public partial class ROLE
{
}

public class RoleMetaData
{
    [Display(Name = "Role")]
    public string ROLE_DESCRIPTION { get; set; }

    [Display(Name = "Username")]
    public string ROLE_USERNAME { get; set; }
}

Если вы использовали базу данных, и код вашей модели был автоматически сгенерирован, это сообщение появится над вашим кодом модели:

Этот код был сгенерирован из шаблона. Ручные изменения этого файла могут привести к неожиданному поведению в вашем приложении. Ручные изменения этого файла будут перезаписаны, если код будет регенерирован

Если вы хотите использовать аннотации данных, и вы не хотите, чтобы их переписывали, если вы обновляете edmx, просто добавьте еще один неполный класс в вашу папку моделей, которая выглядит как пример выше.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow