Удаленная проверка не работает в ASP.NET MVC 5 - PullRequest
0 голосов
/ 24 февраля 2019

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

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

Любая помощь с моим кодом будет отличнойПомогите.Спасибо

Ниже приведены мои действия в контроллере

    public JsonResult IsEmailExists(string CustomerEmail)
    {
        emedicineEntities _db = new emedicineEntities();
        return Json(!_db.Customers.Any(x => x.CustomerEmail == CustomerEmail), JsonRequestBehavior.AllowGet);
    }



Ниже приведены мои метаданные

namespace eMedicine.Model
{
    public class CustomerMetaDta
    {
        [Remote("IsEmailExists", "Customers", ErrorMessage = "EmailId already exists.")]
        [Required(ErrorMessage = "Please Enter Emailw")]
        public string CustomerEmail { get; set; }
    }
}



Ниже мой частичный класс

namespace eMedicine.Model
{
    [MetadataType(typeof(CustomerMetaDta))]
    public partial class Customer
    {
    }
}



Ниже мой взгляд, состоящий из электронной почты клиента

<link href="~/Content/Site.css" rel="stylesheet" />
<script src="~/Scripts/jquery-3.3.1.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

@using (Html.BeginForm("Create", "Customers", FormMethod.Post, new { @id = "register" }))
{
    @Html.AntiForgeryToken()
    <div class="form-horizontal">
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(model => model.CustomerName, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.CustomerName, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.CustomerName, "", new { @class = "text-danger" })
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.CustomerEmail, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.CustomerEmail, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.CustomerEmail, "", new { @class = "text-danger" })
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.PasswordHash, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.PasswordHash, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.PasswordHash, "", new { @class = "text-danger" })
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>
}

Ответы [ 4 ]

0 голосов
/ 06 мая 2019

Одна вещь, о которой никто не упомянул, которая вызовет ваши симптомы: если метод должен быть выполнен анонимными пользователями, и у вас нет атрибута AllowAnonymous в вашем методе, метод не сработает (и кнопка отправки не будетделай что угодно.

0 голосов
/ 24 февраля 2019

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

Вот мой исходный код.

namespace WebApplication1.Controllers
{
    public class CustomerMetaDta
    {
        [Remote("IsEmailExists", "Customer", ErrorMessage = "EmailId already exists.")]
        [Required(ErrorMessage = "Please Enter Emailw")]
        public string CustomerEmail { get; set; }
    }

    [MetadataType(typeof(CustomerMetaDta))]
    public partial class Customer
    {

    }

    public partial class Customer
    {
        public string CustomerEmail { get; set; }
        public string CustomerName { get; set; }
        public string PasswordHash { get; set; }
    }
    public class CustomerController : Controller
    {
        public JsonResult IsEmailExists(string CustomerEmail)
        {
            //emedicineEntities _db = new emedicineEntities();
            List<Customer> _db = new List<Customer>
            {
                new Customer { CustomerEmail  = "hien@gmail.com"},
                new Customer { CustomerEmail  = "hien1@gmail.com"}
            };
            return Json(!_db.Any(x => x.CustomerEmail == CustomerEmail), JsonRequestBehavior.AllowGet);
        }
        // GET: Customer
        public ActionResult Index()
        {
            return View();
        }
    }
}

Файл Index.cshtml:

@model WebApplication1.Controllers.Customer

@{
    ViewBag.Title = "Index";
}
<script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.0/jquery.validate.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"></script>

@using (Html.BeginForm("Create", "Customer", FormMethod.Post, new { @id = "register" }))
{
    @Html.AntiForgeryToken()
    <div class="form-horizontal">
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.CustomerName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.CustomerName, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.CustomerName, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(model => model.CustomerEmail, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.CustomerEmail, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.CustomerEmail, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(model => model.PasswordHash, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.PasswordHash, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.PasswordHash, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

Он переходит к методу IsEmailExists (), и это вывод результата enter image description here

Может быть, вы пропустили настройку

<add key="ClientValidationEnabled" value="true"/>
 <add key="UnobtrusiveJavaScriptEnabled" value="true"/>

в web.config?

0 голосов
/ 27 февраля 2019

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

Есть несколько вещей, которые нужно проверить:

Доступен ли ваш код удаленной проверки клиенту вообще?

Первое, на что нужно обратить внимание, это может быть проблема безопасности / аутентификации.Есть несколько простых вещей, которые вы можете сделать, чтобы проверить, что:

  • Если на контроллерах или методах установлены атрибуты аутентификации, попробуйте их закомментировать
  • попробуйте закомментировать любую другую аутентификациюкод

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

  • Почтальон получает обратно 200 от вашего метода.
  • Если это так, установите точку останова в своем коде и проверьте, что она действительно выполняется.

ЕслиТогда почтальон может добраться до вашей конечной точки ...

Есть ли проблема в вашем коде?

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

Это свойство модели с набором удаленной проверки:

    [System.Web.Mvc.Remote(
        action: "CheckExistingDocumentCode",
        controller: "Documents",
        AdditionalFields = "DocumentId",
        HttpMethod = "POST",
        ErrorMessage = "Code already exists")]
    public string DocumentCode { get; set; }

Это соответствующий метод в контроллере Documents:

[HttpPost]
public async Task<ActionResult> CheckExistingDocumentCode(string DocumentCode, int DocumentId)
{
    try
    {
        if (!await _documentValidationRules.IsExistingDocumentCodeAsync(DocumentCode, DocumentId))
        {
            return Json(true, JsonRequestBehavior.AllowGet);
        }
        return Json("This Document Code is already in use", JsonRequestBehavior.AllowGet);
    }
    catch (Exception ex)
    {
        return Json(ex.ToString(), JsonRequestBehavior.AllowGet);
    }
}

Вы можете видеть, что я явно назвал все параметры в свойстве модели, чтобы точно понять, что происходит.

Сравнивая мой код с вашим, основные различия заключаются в следующем:

  • Мины асинхронные.Это не должно иметь никакого значения.
  • Мой метод контроллера - это POST (поэтому он имеет атрибут HttpPost, что также означает, что мне нужно было сообщить модели, что HttpMethod тоже был POST)
  • Мой метод удаленной проверки принимает два параметра, поэтому я передаю дополнительное свойство через аргумент AdditionalFields

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

Надеюсь, что-то из приведенного выше приблизит вас.

0 голосов
/ 24 февраля 2019

Измените подпись вашего метода следующим образом, включив атрибут / свойство Bind Prefix.

public JsonResult IsEmailExists([Bind(Prefix="Customer.CustomerEmail")] string CustomerEmail)
{
    emedicineEntities _db = new emedicineEntities();
    return Json(!_db.Customers.Any(x => x.CustomerEmail == CustomerEmail), JsonRequestBehavior.AllowGet);
}

Теперь это должно работать!

...