.NETCore и как использовать AJAX Post-запрос для обновления базы данных SQL

#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] исправили проблему. База данных обновлена. Спасибо!