2016-07-15 36 views
0

我想發送一個複雜的JavaScript對象到mvc控制器後期的方法。 每次運行該方法時都會收到一個BadRequest響應。它不會讓我用Visual Studio進行調試,只能使用Web開發人員工具進行調試。我檢查與提琴手,看看我的JSON對象似乎是在視圖模型相同的順序。有誰能幫我解決這個問題嗎? 我正在使用Asp.Net Core 1.0。如果我需要提供更多信息,請告訴我。如何用ajax post方法向c#控制器發送複雜對象?

這裏的是我的視圖模型:

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

編譯對象的邏輯如下:

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

這是我的AJAX方法:

function saveRoute() { 
    var apiUrl = location.origin + "/map/AddRoute"; 
    $.ajax({ 
     method: "POST", 
     url: apiUrl, 
     contentType: "application/json;charset=utf-8", 
     data: (createObject()) 
    }).done(function (msg) { 
     alert("Data saved: " + msg); 
    }).error(function(msg){alert("Error: "+ msg)}); 
} 

的控制器,其接到帖子如下:

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

這裏是我的RAW帖子:

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} 

誠如通過@Kiran Challa我收集了我的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 
+0

你能分享你的請求json數據看起來像通過電線嗎? –

+0

我相信沒有必要'JSON.stringify()' – erdinger

+0

我添加了RAW提琴手發佈數據。我需要添加其他東西嗎?我不熟悉提琴手。 –

回答

0

我發現,我出了問題。我需要發送所需的驗證令牌以及ajax post方法,或者在我的控制器中拿走'[ValidateAntiForgeryToken]'。因爲安全不是我目前的目標,所以我選擇了後者。感謝您的建議@KiranChalla -

1

試圖爲您的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}); 
} 
+0

嗨,我試了這個。它將checkpoints數組和整數封裝在一個對象中,這很酷,而且結果中幾乎沒有任何變化。 –

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

worked out image

+0

我改變了**公共IActionResult AddRoute([FromBody] RouteViewModel路由)**公共ActionResult AddRoute(RouteViewModel路由) –

+0

我試過這個改變,但沒有結果。我認爲ActionResult可以訪問與其接口IActionResult相同的功能。 –

相關問題