Javascript 如何使用ajax post方法将复杂对象发送到c#controller?

Javascript 如何使用ajax post方法将复杂对象发送到c#controller?,javascript,c#,asp.net-core-1.0,Javascript,C#,Asp.net Core 1.0,我正在尝试向mvc控制器post方法发送一个复杂的javascript对象。 每次运行该方法时,我都会收到一个BadRequest响应。它不允许我使用VisualStudio进行调试,只允许使用web开发人员工具进行调试。我与fiddler进行了检查,以查看我的JSON对象似乎与视图模型的顺序相同。谁能帮我一下吗? 我正在使用Asp.NETCore1.0。如果我需要提供更多信息,请告诉我 以下是我的视图模型: public class RouteViewModel { p

我正在尝试向mvc控制器post方法发送一个复杂的javascript对象。 每次运行该方法时,我都会收到一个BadRequest响应。它不允许我使用VisualStudio进行调试,只允许使用web开发人员工具进行调试。我与fiddler进行了检查,以查看我的JSON对象似乎与视图模型的顺序相同。谁能帮我一下吗? 我正在使用Asp.NETCore1.0。如果我需要提供更多信息,请告诉我

以下是我的视图模型:

public class RouteViewModel
    {
        public RouteViewModel() { }
        public List<CheckpointViewModel> Checkpoints { get; set; }
        public int TotalDistance { get; set; }
    } 
 public class CheckpointViewModel
    {
        public decimal Latitude { get; set; }
        public decimal Longitude { get; set; }
    }
接收post的控制器如下所示:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult AddRoute([FromBody]RouteViewModel route)
        {
            RouteViewModel newRoute = route;
            if (ModelState.IsValid)
            {
                _context.AddRoute(newRoute.Checkpoints, newRoute.TotalDistance);
                _context.SaveRoute();
                return RedirectToAction("SavedRoutes");
            }
            else
            {
                return BadRequest(ModelState);
            }
        }
以下是我的原始帖子:

POST https://localhost:44343/map/AddRoute HTTP/1.1
Host: localhost:44343
Connection: keep-alive
Content-Length: 290
Accept: */*
Origin: https://localhost:44343
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Content-Type: application/json;charset=UTF-8
Referer: https://localhost:44343/Map/Map
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8
Cookie: .AspNetCore.Antiforgery.4IsE6XVGxQo=CfDJ8HmVr1mwBStLrOG_4RXM-sje_SmjZYd-GboPG5E19rchqlC61XsNEwa7yOgIySC-U63iTH6cD0ggwqwmwdPJOibPKrxlctls_a_b3wmPvai80vYUx6j0Lckfn24GBf7X_xZhAl3eac892j7YDJWa9Oc; .AspNetCore.Identity.Application=CfDJ8HmVr1mwBStLrOG_4RXM-shK66Uthf3kfJJezCs7HCTztr-seJHxVj8l5MS66u4EWd72NEXUjebAIfHIxFZvHjZzjiQSVfLCxdHnmcsbYWXgGAmaA_sBjdimNQXnPAC-NMtp_fDeTCPJEoB1lBy1hl-GFQaAJdRzVrcc7OchWTSBVZ9jdHmm0htNyChcJ8BUCczH8FhVnPeFzlCM_reR8u2vsQrOxY_ZmczdUQ_mqCmTVLGDdRRJwHLhuafrZ2mmAXq1iDzQhprtv98qAx2zM4TSoAOBKoeALq_Oa2n1SDvFMMtGseDB1mLsj-LkPlKhcCmtB14kwDRctvOtxOqCbQTfFjhLlc5405_dccQjWJ3mITtn1ss3x1aHUP-pHHzFX9ZhusQ1-IqV4pPDs12c1q2B5Uz0qEOHaUByVEE5bKpzklTT2kxNW1V81aGMMmwbi9zFkuh9nUFnQmGCqf5VXSx-FTm-UDWZgyMnK0JpG7K4cpiSeycv9sOeP1qUlz-P28RXLhCvqYAX3FIccRfoQMf63tU5OfVhu1bhRdV_NQALhBpku9nrxFyxxECe5WRc4It-kCLiaOQBlYa9bewb80QiWIS-wHNDY5vVcdAkd2D5

{"Checkpoints":[{"Latitude":-34.004057732693184,"Longitude":25.649633891880512},{"Latitude":-34.00313273259371,"Longitude":25.65392542630434},{"Latitude":-34.001425013635725,"Longitude":25.653367526829243},{"Latitude":-34.00019756942711,"Longitude":25.650320537388325}],"TotalDistance":919}
根据@I的建议,我在控制器中收集了我的modelstate错误,并将其写入输出窗口,如下所示:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult AddRoute([FromBody]RouteViewModel route)
        {
            RouteViewModel newRoute = route;
            if (ModelState.IsValid)
            {
                _context.AddRoute(newRoute.Checkpoints, newRoute.TotalDistance);
                _context.SaveRoute();
                return RedirectToAction("SavedRoutes");
            }
            else
            {
                //Getting errors
                var errors = ModelState.Values.SelectMany(v => v.Errors);
                Debug.WriteLine("Errors found: "+ errors+"\nEnd Errors found");
                return BadRequest(ModelState);
            }
        }
在我的输出窗口中,当我触发控制器时,我收到的是以下内容:

Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: The required antiforgery header value "RequestVerificationToken" is not present.
   at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.<ValidateRequestAsync>d__9.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ValidateAntiforgeryTokenAuthorizationFilter.<OnAuthorizationAsync>d__3.MoveNext()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Warning: Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ValidateAntiforgeryTokenAuthorizationFilter'.
Microsoft.AspNetCore.Mvc.StatusCodeResult:Information: Executing HttpStatusCodeResult, setting HTTP status code 400
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 37.4837ms 400 
Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException:所需的Antiforgery标头值“RequestVerificationToken”不存在。
在Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.d_u9.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ValidateAntiforgeryTokenAuthorizationFilter.d_u3.MoveNext()中
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:警告:对筛选器“Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ValidateAntiforgeryTokenAuthorizationFilter”处的请求的授权失败。
Microsoft.AspNetCore.Mvc.StatusCodeResult:信息:执行HttpStatusCodeResult,设置HTTP状态代码400
Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求在37.4837ms 400内完成

尝试让createObject()返回以下内容:

function createObject() {
    var routeModel = { Checkpoints: [] ,TotalDistance:totalDistance};
    for (var i = 0; i < markersOrders.length; i++) {
        var latlng = markersOrders[i].getPosition();
        var Checkpoint = {
            'Latitude': latlng.lat(),
            'Longitude': latlng.lng()
        };
        routeModel.Checkpoints.push(Checkpoint);
    }
    return JSON.stringify({route: routeModel});
}
函数createObject(){
var routeModel={Checkpoints:[],TotalDistance:TotalDistance};
对于(var i=0;i

我发现我错在哪里了。我需要将所需的验证令牌与ajax post方法一起发送,或者在控制器中删除“[ValidateAntiForgeryToken]”。我选择后者,因为安全不是我目前的目标。谢谢你的建议@–

你能通过网络分享你的请求json数据是什么样子吗?我相信没有必要使用
json.stringify()
我添加了原始的fiddler Post数据。我还需要补充什么吗?我对fiddler不太熟悉。@erdinger它不工作会有什么不同吗?试着做两件事:1。州政府怎么说?它是否显示任何错误?2.启用日志记录(例如:控制台)并查看日志是否有任何错误更改**public IActionResult AddRoute([FromBody]RouteViewModel route)**到public ActionResult AddRoute(RouteViewModel route)我尝试了此更改,但没有结果。我认为ActionResult可以访问与其接口IActionResult相同的函数。嗨,我试过这个。它将检查点数组和整数封装在一个对象中,这很酷,结果几乎没有任何变化。
Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: The required antiforgery header value "RequestVerificationToken" is not present.
   at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.<ValidateRequestAsync>d__9.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ValidateAntiforgeryTokenAuthorizationFilter.<OnAuthorizationAsync>d__3.MoveNext()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Warning: Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ValidateAntiforgeryTokenAuthorizationFilter'.
Microsoft.AspNetCore.Mvc.StatusCodeResult:Information: Executing HttpStatusCodeResult, setting HTTP status code 400
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 37.4837ms 400 
function createObject() {
    var routeModel = { Checkpoints: [] ,TotalDistance:totalDistance};
    for (var i = 0; i < markersOrders.length; i++) {
        var latlng = markersOrders[i].getPosition();
        var Checkpoint = {
            'Latitude': latlng.lat(),
            'Longitude': latlng.lng()
        };
        routeModel.Checkpoints.push(Checkpoint);
    }
    return JSON.stringify({route: routeModel});
}
  [HttpPost]        
    [ValidateAntiForgeryToken]  
     public ActionResult AddRoute(RouteViewModel route)  
    {  
        RouteViewModel newRoute = route;  
        if (ModelState.IsValid)  
        {  
            _context.AddRoute(newRoute.Checkpoints, newRoute.TotalDistance);  
            _context.SaveRoute();  
            return RedirectToAction("SavedRoutes");  
        }  
        else  
        {  
            return BadRequest(ModelState);  
        }  
    }