2011-08-24 110 views
0

我正在使用MVC2的一些舊例子,在將json發佈到控制器動作時使用了[fromJson]屬性,它工作正常,但它沒有捕獲模型錯誤,因此ModelState。 IsValid總是如此。然後我看到發佈的JSON被構建到MVC3中,所以我升級了我的代碼。但現在我有另一個問題:)使用:Knockout和ko.utils.postJson問題

ko.utils.postJson(location.href, json); 

綁定不起作用,我的模型是空的。

但如果使用jQuery:

$.ajax({ 
          url: '@Url.Action("Create")', 
          contentType: 'application/json; charset=utf-8', 
          type: "POST", 
          data: json, 
          dataType: 'json', 
          success: function(result) { 
           alert("yay"); 
          }, 
          error: function(xhr, ajaxOptions, thrownError) { 
           alert(xhr.statusText + " " + xhr.responseText); 
          } 
         }); 

所以我想我會用我ko.utils.postJson移動到JQuery的$阿賈克斯但我怎麼剛剛交的,所以我可以以後做一個RedirectToAction?

所以澄清!控制器動作看起來是這樣的:

public ActionResult Create(QuestionViewModel questionViewModel){ 

    if (ModelState.IsValid) 
    { 
     questionViewModel.Save(); 

     TempData.Add(Config.MODEL, questionViewModel); 
     return RedirectToAction("Edit"); 
    } 

    PopulateViewBag(); 

    return View(questionViewModel); 
} 

我發現這個http://groups.google.com/group/knockoutjs/browse_thread/thread/e631a544de2ad51e在淘汰賽論壇,以便ko.utils.postJson是一個「正常」的形式提交。這是我想要做的,所以應用程序的流程保持不變。

+0

你的意圖是什麼?您是否希望將ajax調用重定向到一個新的URL,該URL返回ajax調用的實際響應,或者,您希望瀏覽器中的當前整個頁面是否被重定向到另一個url(刷新)? – Zasz

+0

我試圖澄清以上。 – rafn

回答

0

由於$ .ajax()不會創建<form>標記並提交它,因此您無法在ajax帖子期間執行諸如RedirectToAction之類的操作。 ko.utils.postJson允許你做所有的事情,因爲它在dom內部創建了一個快速的表單標籤並通過腳本提交。

你可以做的是:

$.ajax({ 
    statusCode: { 
    302: function() { 
     window.location.replace("http://Domain.com/Controller/Edit") 
    } 
    } 
}); 

This問題幫我找到通過腳本來重定向瀏覽器的方式。 This頁面告訴您如何處理服務器返回的不同狀態代碼。在Controller中使用RedirectToAction()時,ASP.NET MVC3會返回302狀態碼。這可以通過添加如上所示的適當處理程序來處理。

+0

好吧,這個作品相當不錯,我只是不樂意跟蹤JavaScript的跟蹤。也許我會回覆淘汰賽,並實施模型的一些驗證,這是我原來的問題...嗯 – rafn

+0

如果你不喜歡把網址放在JavaScript中,你可以按照[this](http:// stackoverflow.com/questions/199099/how-to-manage-a-redirect-request-after-a-jquery-ajax-call)回答。或者更合適的,看看[這個](http://stackoverflow.com/questions/1557602/jquery-and-ajax-response-header)答案來實際閱讀從**位置**標題去的URL從響應。 – Zasz