Удаленная проверка 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. Он проверяет наличие электронной почты в базе данных и показывает следующую ошибку:
адрес электронной почты уже существует
-
Действие контроллера аккаунта
[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;
-
Добавить проверку модели
[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; }
-
Добавить скрипты
<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);
}
}