. Net core - Ajax post не передает переменные в метод контроллера - PullRequest
0 голосов
/ 05 марта 2020

Когда я устанавливаю точку останова на LoadReport, каждый параметр равен нулю. По некоторым причинам значения не привязываются к параметрам с тем же именем.

Javascript / AJAX

$('#savedCriteria').on('change', function () {
    var criteriaSelected = $('#savedCriteria option:selected').text();
    var data = { actionName: "Daily", reportInput: "ReportDaily", reportCriteria: criteriaSelected };
    //Ajax form post
    $.ajax({
        type: 'POST',
        data: data,
        contentType: "application/json; charset=utf-8",
        url: '@Url.Action("LoadReport", ViewContext.RouteData.Values["Controller"].ToString())',
        success: function (data) {
            if (data.success) {
                alert("Test");
            } else {
                alert("Test Not Successful");
            }
        }
    });
});

Контроллер

public void LoadReport(string actionName, string reportInput, string reportCriteria)
{
    var reportObject = Activator.CreateInstance(Type.GetType(reportInput));
    IEnumerable<Test.Reports.Utilities.ReportCriteria> reportList = getReportCriteria(reportInput);
    RedirectToAction(actionName, "Reports", reportList.Where(x => x.CriteriaName == reportCriteria));
}

1 Ответ

2 голосов
/ 05 марта 2020

Тип метода по умолчанию - HttpGet, вам нужно установить его на HttpPost.

[HttpPost]
public void LoadReport(string actionName, string reportInput, string reportCriteria)
{
    var reportObject = Activator.CreateInstance(Type.GetType(reportInput));
    IEnumerable<Test.Reports.Utilities.ReportCriteria> reportList = getReportCriteria(reportInput);
    RedirectToAction(actionName, "Reports", reportList.Where(x => x.CriteriaName == reportCriteria));
}

Также имейте в виду, что с вашим вызовом ajax вы не можете использовать RedirectToAction. Вам нужно что-то вроде этого:

[HttpPost]
public ActionResult  LoadReport(string actionName, string reportInput, string reportCriteria)
{
    var reportObject = Activator.CreateInstance(Type.GetType(reportInput));
    IEnumerable<Test.Reports.Utilities.ReportCriteria> reportList = getReportCriteria(reportInput);
    Return Json(Url.Action(actionName, "Reports", reportList.Where(x => x.CriteriaName == reportCriteria));
}

И в вашем ajax вызове:

success: function (data) {
   window.location.href = data;
   }

ОБНОВЛЕНИЕ: вам также нужно создать объект POCO и добавить его в метод HttpPost как параметр вместо отдельных параметров. Также необходим атрибут [FromBody].

POCO:

public class Data
{
    public string actionName { get; set; }
    public string reportInput { get; set; }
    public string reportCriteria { get; set; }

}

Контроллер:

[HttpPost]
public JsonResult LoadReport([FromBody]Data data)
{
    var reportObject = Activator.CreateInstance(Type.GetType(data.reportInput));
    IEnumerable<Test.Reports.Utilities.ReportCriteria> reportList = getReportCriteria(data.reportInput);
    return Json(Url.Action(data.actionName, "Reports"));
}
...