简体   繁体   English

.Net 核心 - Ajax post 不会将变量传递给控制器​​方法

[英].Net core - Ajax post does not pass variables to controller method

When I set a breakpoint on LoadReport, every parameter is null.当我在 LoadReport 上设置断点时,每个参数都为空。 For some reason the values are not binding to the parameters with the same name.出于某种原因,这些值没有绑定到具有相同名称的参数。

Javascript/AJAX 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");
            }
        }
    });
});

Controller控制器

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

Default method type is HttpGet, you need to set it to HttpPost.默认方法类型为 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));
}

Also keep in mind that with your ajax call you can not use RedirectToAction.还要记住,使用 ajax 调用不能使用 RedirectToAction。 You need something like this:你需要这样的东西:

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

And in your ajax call:在你的 ajax 调用中:

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

UPDATE: you also need to create a POCO object and add that to the HttpPost method as parameter instead of separate parameters.更新:您还需要创建一个 POCO 对象并将其作为参数而不是单独的参数添加到 HttpPost 方法中。 Also [FromBody] attribute is needed.还需要 [FromBody] 属性。

POCO:波科:

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

}

Controller:控制器:

[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"));
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM