Я работаю над приложением .NETCore и хочу использовать вызов jQuery AJAX Post для обновления моей базы данных 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-адрес @ Url.Action. Я также пробовал использовать имя контроллера и действия следующим образом: «/ 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;
    }

Вот код моей модели HomeViewModel:

   public class HomeViewModel
{
    public Project Project{ get; set; }
    public IEnumerable<Project> Projects { get; set; }
    public IEnumerable<SelectListItem> TeamDropDown { get; set; }
    public IEnumerable<SelectListItem> GroupDropDown { get; set; }
    public IEnumerable<SelectListItem> StatusDropDown { get; set; }
    public IEnumerable<SelectListItem> NotesDropDown { get; set; }
    public IEnumerable<SelectListItem> NetworkDropDown { get; set; }
    public IEnumerable<SelectListItem> 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-часть моей формы:

       <div class="tab-pane" id="milestones" role="tabpanel">
                    <br />
                    <fieldset class="form-group">
                        <input class="form-control col-2" asp-for="Milestone.Date" type="text" value="@ViewBag.DateNoTime" id="milestoneDate">
                    </fieldset>
                    <fieldset class="form-group">
                        <input class="form-control" type="text" asp-for="Milestone.MilestoneName" oninput="charLimit();" id="milestoneText" />
                        <p>
                            <small class="text-danger" id="milestoneValidation" style="padding-top: 10px; display: none;">Please provide milestone text.</small>

                        </p>
                    </fieldset>
                    <br />
                    <a class="btn btn-primary" id="addMilestoneBtn">Add Milestone</a>
                    <br />
                    <div id="milestoneTable"></div>
                </div>

Класс вехи:

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; }
}

Заранее спасибо за вашу помощь!

2
NerdyDriod 23 Ноя 2021 в 18:06
Вы уже пробовали его отлаживать? Например, ваш контроллер получает удар от AJAX?
 – 
Anirudh Singh Rawat
23 Ноя 2021 в 18:16
Вы тоже можете опубликовать HomeViewModel, пожалуйста?
 – 
Serge
23 Ноя 2021 в 18:18
Я разместил HomeViewModel, спасибо!
 – 
NerdyDriod
23 Ноя 2021 в 18:26
Я установил точки останова, но контроллер не получает попадание от ajax
 – 
NerdyDriod
23 Ноя 2021 в 18:27
Спасибо, теперь было бы неплохо, если бы вы тоже разместили класс Milestone
 – 
Serge
23 Ноя 2021 в 18:28

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], поскольку вы используете contentType "application / json"

    [HttpPost("~/Home/AddMilestone")]
    public bool AddMilestone([FromBody] Milestone mileStone)
    {
       
        mileStone.Date = DateTime.Today;
       
        _db.Milestones.Add(mileStone);
        _db.SaveChanges();

        return true;
    }
   
1
Serge 23 Ноя 2021 в 18:42
Я все еще получаю ошибку 400, и она не попадает в контроллер
 – 
NerdyDriod
23 Ноя 2021 в 18:32
Попробуйте другой URL-адрес, который я опубликовал, если все еще не работает класс вехи публикации, пожалуйста
 – 
Serge
23 Ноя 2021 в 18:33
Итак, теперь он попадает в контроллер с обновленным URL-адресом, но все данные возвращаются как нулевые.
 – 
NerdyDriod
23 Ноя 2021 в 18:41
Вы используете [FromBody]?
 – 
Serge
23 Ноя 2021 в 18:43
Добавление [FromBody] и обновление [HttpPost] устранили проблему. База данных обновлена. Спасибо!
 – 
NerdyDriod
23 Ноя 2021 в 18:46