#c# #asp.net #asp.net-mvc #api #asp.net-web-api
Вопрос:
Это ошибка, которую я получаю в своей консоли;
ПОЛУЧИТЬ http://localhost:1089/api/Employee/EmailAlreadyExist?»some@abc.com» 404 (Не найдено)
Это мой код ajax, в котором я отправляю электронное письмо пользователю при создании нового пользователя, и я хочу, чтобы этот метод сообщал мне, существует ли электронное письмо в базе данных или нет;
function CheckAvailability() {
var email = $("#officialemail").val();
$.ajax({
type: "GET",
url: 'http://localhost:1089/api/Employee/EmailAlreadyExist',
dataType: 'json',
contentType: "application/json",
data: JSON.stringify(email),
success: function (response) {
var message = $("#message");
if (response) {
//Email available.
message.css("color", "green");
message.html("Email is available");
}
else {
//Email not available.
message.css("color", "red");
message.html("Email is NOT available");
}
}
});
}
function ClearMessage() {
$("#message").html("");
};
и я передаю всю эту функцию в другой функции, в которой я передаю параметр электронной почты в попытке создать нового пользователя вместе со всеми другими параметрами с их значениями;
$('.empOfficialDetails').click(function (ev) {
ev.preventDefault();
CheckAvailability()
var data = new Object();
data.UserName = $('#username').val();
data.UPassword = $('#userpass').val();
data.OfficialEmailAddress = $('#officialemail').val();
data.Departments = $('#departments :selected').text();
data.Designation = $('#designation :selected').text();
data.RoleID = $('#role').val();
data.Role = $('#role :selected').text();
data.ReportToID = $('#reportToID').val();
data.ReportTo = $('#reportTo :selected').text();
data.JoiningDate = $('#joindate').val();
data.IsAdmin = $('#isAdmin :selected').val() ? 1 : 0;
data.IsActive = $('#isActive :selected').val() ? 1 : 0;
data.IsPermanent = $('#isPermanent :selected').val() ? 1 : 0;
data.DateofPermanancy = $('#permanantdate').val();
data.HiredbyReference = $('#hiredbyRef :selected').val() ? 1 : 0;
data.HiredbyReferenceName = $('#refePersonName').val();
data.BasicSalary = $('#basicSalary').val();
data.CurrentPicURL = $('.picture').val();
if (data.UserName amp;amp; data.UPassword amp;amp; data.OfficialEmailAddress amp;amp; data.Departments amp;amp; data.Designation amp;amp; data.Role amp;amp; data.IsAdmin amp;amp; data.IsPermanent) {
$.ajax({
url: 'http://localhost:1089/api/Employee/EmpOfficialDetails',
type: "POST",
dataType: 'json',
contentType: "application/json",
data: JSON.stringify(data),
beforeSend: function () {
$("#dvRoomsLoader").show();
},
complete: function () {
$("#dvRoomsLoader").hide();
},
success: function (data) {
var ID = parseInt(data);
if (ID > 0) {
//var id = data;
$(".HiddenID").val(data);
//var id = $(".HiddenID").val();
$('#official').css('display', 'block');
$('#official').html("Employees Official details added successfully...!");
$('#official').fadeOut(25000);
$("#dvRoomsLoader").show();
$('.empOfficialDetails').html("Update amp;nbsp; <i class='fa fa-angle-right rotate-icon'></i>");
}
else {
$('#official').find("alert alert-success").addClass("alert alert-danger").remove("alert alert-success");
}
},
error: function (ex) {
alert("There was an error while submitting employee data");
alert('Error' ex.responseXML);
alert('Error' ex.responseText);
alert('Error' ex.responseJSON);
alert('Error' ex.readyState);
alert('Error' ex.statusText);
}
});
}
return false;
});
и в моем контроллере я использую встроенный запрос для проверки наличия аналогичной электронной почты в моей базе данных;
[Route("api/Employee/EmailALreadyExist")]
[HttpGet]
public bool EmailAlreadyExist(string email)
{
string retval;
var con = DB.getDatabaseConnection();
Employee emp = new Employee();
string query = "IF EXISTS (SELECT 1 FROM Employee WHERE OfficialEmailAddress = @OfficialEmailAddress)";
SqlCommand com = new SqlCommand(query, con);
com.Parameters.AddWithValue("@OfficialEmailAddress", email);
email = emp.OfficialEmailAddress;
SqlDataReader rdr = com.ExecuteReader();
if (rdr.HasRows)
{
retval = "true";
}
else
{
retval = "false";
}
return Convert.ToBoolean(retval);
}
вся помощь, которую я получаю, высоко ценится, и все предложения по улучшению этого кода горячо приветствуются
Спасибо
Комментарии:
1. Вы проверяли свой
EmailAlreadyExist(
метод напрямую?2. @JeroenvanLangen Да, но я не знаю, почему я получаю ошибку все время, когда запускаю ее, и я новичок во всем этом, так что все это действительно сбивает меня с толку
3.
EmailAlreadyExist
противEmailALreadyExist
— они не одно и то же. Таким образом, вы вызываете маршрут, которого не существует.
Ответ №1:
Я вижу, что в маршруте есть опечатка. Буква L в EmailALreadyExist пишется с заглавной буквы. Но вы называете это строчной буквой.
Кроме того, я вижу отсутствующую точку с запятой в коде Ajax, проверьте это тоже.
Комментарии:
1. На
CheckAvailability()
линии, то есть, верно? (Отсутствует «;»)2. Да, вот так. Извините, что опустил это. Я на самом деле не очень тщательно проверял ваш код, просто следил за вашей ошибкой, пока не наткнулся на первую проблему, а затем остановился. Все последующие проблемы появятся, как только это будет решено.
Ответ №2:
- В вашем коде используется метод GET, у которого не может быть тела. Поэтому ему пришлось добавить к нему параметр URL. В ASP.NET он должен быть назван. Но ваш метод не имеет именованных параметров. Так его и не нашли. Добавьте имя параметра в свою полезную нагрузку (имя «электронная почта»). в ваш JSON — замените в вашей функции JS
CheckAvailability
data: JSON.stringify(email),
наdata: JSON.stringify({email: email}),
. Тогда jQuery должен запросить, чтобыapi/Employee/EmailALreadyExist?email=....
это совпадалоpublic bool EmailAlreadyExist(string email)
. - Лучше использовать метод POST, чтобы скрыть электронное письмо в теле запроса. Тогда ваш исходный код может иметь меньшее обновление на C#:
public bool EmailAlreadyExist([FromBody]string email)
. Он сопоставит один параметр из тела с переменной C#email
. - Есть смысл отделить вашу логику от контроллера. «Тонкий контроллер» может проверять параметры, служба будет содержать вашу «бизнес-логику».
Комментарии:
1. «EmailALreadyExist» => Я бы на самом деле исправил опечатку в маршруте.
Ответ №3:
С вашего URL-адреса
http://localhost:1089/api/Employee/EmailAlreadyExist?"some@abc.com"
похоже, вы неправильно передаете параметр электронной почты.
Вы можете передать это так
http://localhost:1089/api/Employee/EmailAlreadyExist?email=some@abc.com
или немного измените свой маршрут, чтобы поддержать свой URL
[Route("api/Employee/EmailAlreadyExist/{email}")]