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

Мне нужно проверить значение поля ввода от пользователя до отправки формы.

Я создал действие в своем настраиваемом контроллере и украсил его полем:

имя действия: CheckValue имя контроллера: Validate

[Remote("CheckValue", "Validate"), ErrorMessage="Value is not valid"]
public string Value { get; set; }

Проблема заключается в том, когда я нажимаю кнопку "Отправить", форма отправляется, а затем отображается сообщение Value is not valid, если введенное пользователем значение недействительно.

Как я могу проверить значение, введенное пользователем, и предотвратить отправку формы, если значение недопустимо, и отобразить сообщение об ошибке?

Если я попытаюсь использовать JavaScript для проверки правильности формы $("#formId").valid(), которая возвращает true, это означает, что независимо от того, что является статусом значения (действительным или нет), форма действительна.

С другой стороны, если я украшу другое поле атрибутом [Required], форма не будет отправлена, и ошибка будет показана для этого поля, которое требуется. Однако проверка достоверности не выполняется за сценой для поля удаленной проверки.

Ответы

Ответ 1

Полное решение удаленной проверки в MVC. Он проверяет наличие электронной почты в базе данных и показывает следующую ошибку:

адрес электронной почты уже существует

  1. Действие контроллера аккаунта

    [AllowAnonymous]
    [HttpPost]
    public ActionResult CheckExistingEmail(string Email)
    {
        try
        {
            return Json(!IsEmailExists(Email));
        }
        catch (Exception ex)
        {
            return Json(false);
        }
    }
    
    private bool IsEmailExists(string email)
        =>  UserManager.FindByEmail(email) != null;
    
  2. Добавить проверку модели

    [Required]
    [MaxLength(50)]
    [EmailAddress(ErrorMessage = "Invalid Email Address")]
    [System.Web.Mvc.Remote("CheckExistingEmail", "Account", HttpMethod = "POST", ErrorMessage = "Email already exists")]
    public string Email { get; set; }
    
  3. Добавить скрипты

    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
    

Ответ 2

Да, вы должны добавить [Remote] в свою модель:

[Remote("ActionName", "ControllerName", ErrorMessage = "{0} Is somthing!")]
public string yourproperty { get; set; }

И контроллер:

public JsonResult ActionName(string yourproperty)
{
    return Json(!db.yourproperty.Any(lo => lo.yourproperty== yourproperty), JsonRequestBehavior.AllowGet);
}

Работает для меня хорошо; Надеюсь, это будет полезно для вас.

Ответ 3

С ссылкой демонстрация c-sharpcorner

Мы можем использовать RemoteAttribute.

Шаг 1

В HomeController создайте метод и для этого напишите следующее.

public JsonResult IsUserExists(string UserName)   
{  
//check if any of the UserName matches the UserName specified in the Parameter using the ANY extension method.  
return Json(!db.Users.Any(x => x.UserName == UserName) ,JsonRequestBehavior.AllowGet);  
}  

Вам может быть интересно, почему мы возвращаем JsonResult обратно. Мы хотим, чтобы проверка выполнялась на стороне клиента, поэтому мы возвращаем JsonResult.

Шаг 2

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

using System.ComponentModel.DataAnnotations;  
using System.Web.Mvc;   
namespace UniqueField.Models 
{  
   [MetadataType(typeof(UserMetaData))]  
   public partial class User 
   {  
   }  
class UserMetaData 
{  
   [Remote("IsUserExists","Home",ErrorMessage="User Name already in use")]  
   public string UserName { get; set; }  
}  
}  

Шаг 3

В файле create.cshtml нам нужно указать источник трех файлов jQuery в указанном порядке.

<h2>Create</h2>  
<script src="~/Scripts/jquery-1.10.2.js"></script>  
<script src="~/Scripts/jquery.validate.js"></script>  
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>

Ответ 4

Вы не ставите код контроллера. Но должно быть что-то вроде этого:

Ваш код:

[Remote("CheckValue", "Validate", ErrorMessage="Value is not valid")]
public string Value { get; set; }

Мой код для контроллера (Validate):

public ActionResult CheckValue(string Value)
        {
            if (Value == "x value")
            {
        // This show the error message of validation and stop the submit of the form
                return Json(true, JsonRequestBehavior.AllowGet);
            }
            else
            {
        // This will ignore the validation and the submit of the form is gone to take place.
               return Json(false, JsonRequestBehavior.AllowGet);
            }
        }

Ответ 5

Существующие ответы велики, но есть несколько ошибок:

1) Имя параметра метода проверки достоверности должно точно соответствовать имени проверяемого свойства, например. для

[System.Web.Mvc.Remote("CheckExistingDocumentTypeCode", "DocumentTypes", HttpMethod = "POST", ErrorMessage = "Code already exists")]
public string DocumentTypeCode { get; set; }

Параметр метода проверки должен быть вызван DocumentTypeCode, включая заглавную букву, иначе вы получите значение null в качестве параметра вместо значения проверяемого свойства:

[AllowAnonymous]
[HttpPost]
public async Task<ActionResult> CheckExistingDocumentTypeCode(string DocumentTypeCode)

Будьте особенно осторожны, если вы являетесь пользователем Resharper, если вы пишете многоцелевые методы проверки для использования более чем одним свойством.

2) Мне пришлось заставить это работать с сеткой Telerik, и мне пришлось реализовать его несколько иначе, чтобы сообщения об ошибках проверки корректно отображались в сетке (примеры здесь показали "false" как сообщение об ошибке проверки ):

[AllowAnonymous]
[HttpPost]
public async Task<ActionResult> CheckExistingDocumentTypeCode(string DocumentTypeCode)
{
    try
    {
        if (!await IsDocTypeCodeExists(DocumentTypeCode))
        {
            return Json(true, JsonRequestBehavior.AllowGet);
        }
        return Json("This Document Type Code is already in use", JsonRequestBehavior.AllowGet);
    }
    catch (Exception ex)
    {
        return Json(ex.ToString(), JsonRequestBehavior.AllowGet);
    }
}