#c# #.net #ajax #asp.net-core
Вопрос:
Я работаю над приложением .NETCore и хочу использовать почтовый вызов jQuery AJAX для обновления моей базы данных SQL при нажатии кнопки. Я попробовал несколько различных вариантов вызовов ajax, но ничего не работает. Я либо получаю ошибку 404, либо 400. Я не уверен, что делаю что-то не так. Ниже приведен код для моего вызова ajax
$("#addMilestoneBtn").on('click', function (e) { e.preventDefault(); var milestoneDetails = {}; var date = $("#milestoneDate").val(); milestoneDetails.MilestoneName = $("#milestoneText").val(); milestoneDetails.Date = new Date(date); milestoneDetails.Date.setHours(0, 0, 0, 0); milestoneDetails.ProjectId = Number($("#projectId").val()); var jsonData = JSON.stringify(milestoneDetails); var url = '@Url.Action("AddMilestone","HomeController")'; $.ajax({ type: "POST", url: url, data: jsonData, contentType: "application/json; charset=utf-8", dataType: "json", success: OnSuccess, error: OnErrorCall }); function OnSuccess(response) { var result = response.d; if (result == "success") { alert("Milestone Added Sucessfully") //$("#").html("Milestone addded successfully").css("color", "green"); buildMilestoneTable(); } $("#milestoneDate").val(""); $("#milestoneText").val(""); } function OnErrorCall(response) { //$("#").html("An Error has occurred. Please Try Again!").css("color", "red"); console.log(response); } return false; });
Для вызова ajax я попытался @Url.Action создать URL-адрес. Я также попытался использовать контроллер и имя действия следующим образом: «/HomeController/AddMilestone».
Вот код для моего контроллера:
[HttpPost] public bool AddMilestone(HomeViewModel obj) { //Create new Milestone obj.Milestone.Date = DateTime.Today; obj.Milestone.MilestoneName = obj.Milestone.MilestoneName; obj.Milestone.ProjectId = obj.Project.Id; _db.Milestones.Add(obj.Milestone); _db.SaveChanges(); return true; }
Вот код для моей домашней модели:
public class HomeViewModel { public Project Project{ get; set; } public IEnumerablelt;Projectgt; Projects { get; set; } public IEnumerablelt;SelectListItemgt; TeamDropDown { get; set; } public IEnumerablelt;SelectListItemgt; GroupDropDown { get; set; } public IEnumerablelt;SelectListItemgt; StatusDropDown { get; set; } public IEnumerablelt;SelectListItemgt; NotesDropDown { get; set; } public IEnumerablelt;SelectListItemgt; NetworkDropDown { get; set; } public IEnumerablelt;SelectListItemgt; AssigneeDropDown { get; set; } public GTMNote GTMNote { get; set; } public SECNote SECNote { get; set; } public OPSNote OPSNote { get; set; } public LCNote LCNote { get; set; } public CTRNote CTRNote { get; set; } public Update Update { get; set; } public Milestone Milestone { get; set; } public NextStep NextStep { get; set; } }
Вот HTML-часть моей формы:
lt;div class="tab-pane" id="milestones" role="tabpanel"gt; lt;br /gt; lt;fieldset class="form-group"gt; lt;input class="form-control col-2" asp-for="Milestone.Date" type="text" value="@ViewBag.DateNoTime" id="milestoneDate"gt; lt;/fieldsetgt; lt;fieldset class="form-group"gt; lt;input class="form-control" type="text" asp-for="Milestone.MilestoneName" oninput="charLimit();" id="milestoneText" /gt; lt;pgt; lt;small class="text-danger" id="milestoneValidation" style="padding-top: 10px; display: none;"gt;Please provide milestone text.lt;/smallgt; lt;/pgt; lt;/fieldsetgt; lt;br /gt; lt;a class="btn btn-primary" id="addMilestoneBtn"gt;Add Milestonelt;/agt; lt;br /gt; lt;div id="milestoneTable"gt;lt;/divgt; lt;/divgt;
Веховый класс:
public class Milestone { [Key] public int Id { get; set; } [DisplayName("")] public string MilestoneName { get; set; } [DisplayName("Milestone Date")] public DateTime Date { get; set; } //Forgein Keys public int ProjectId { get; set; } [ForeignKey("ProjectId")] public Project Project { get; set; } }
Заранее благодарю вас за вашу помощь!
Комментарии:
1. Вы уже пытались его отладить? Например, ваш контроллер получает удар от AJAX?
2. можете ли вы тоже опубликовать HomeViewModel, пожалуйста?
3. @Serge Я опубликовал домашнюю модель, спасибо!
4. @AnirudhSinghRawat У меня есть настроенные точки останова, но он не получает хит от ajax
5. Спасибо, сейчас было бы неплохо, если бы вы тоже опубликовали класс Milestone
Ответ №1:
попробуйте отправить эти данные
var milestoneDetails = { MilestoneName : $("#milestoneText").val(), ProjectId :$("#projectId".val() }; var jsonData = JSON.stringify(milestoneDetails); var url = '@Url.Action("AddMilestone","HomeController")'; // or try , if you get 404 var url = '/Home/AddMilestone';
и используйте это действие, добавьте [FromBody], так как вы используете тип содержимого «приложение/json»
[HttpPost("~/Home/AddMilestone")] public bool AddMilestone([FromBody] Milestone mileStone) { mileStone.Date = DateTime.Today; _db.Milestones.Add(mileStone); _db.SaveChanges(); return true; }
Комментарии:
1. Я все еще получаю ошибку 400, и она не попадает в контроллер
2. @NerdyDriod Попробуйте другой URL , который я опубликовал, если он все еще не работает, пожалуйста, напишите веховый класс
3. Итак, теперь он попадает на контроллер с обновленным URL-адресом, но все данные возвращаются как пустые
4. @NerdyDriod Вы используете [FromBody]?
5. Добавление [FromBody] и обновление [HttpPost] исправили проблему. База данных обновлена. Спасибо!