2010-11-11 146 views
2

我有一種情況,即通過jQuery $ .ajax將數據發送到控制器,數據是序列化的json字符串。 (MVC 3.0)

它將它很好地綁定 - 我的控制器收到結果並且它們是正確的。現在,我在回發驗證時遇到問題。我懷疑這是因爲並非所有的對象都必然會形成控件本身。

問題是我必須使用javascript將數據添加到我的模型中,因爲模型需要集合中的項目。使用javascript,jquery和模板,我選擇了這個項目,並在將模型發送給Controller之前將其添加到模型中。但是,在回發中,這些數據不存在(這是預期的,因爲它必須將它反序列化到javascript數組中 - 這不是我的問題)。

我的問題是,它執行驗證的雙重回發,或根本沒有。如果我使用e.preventDefault();來停止正常表單發佈,我永遠不會驗證。但如果我不使用它,那我總是得到一個雙重職位,這在我看來永遠不會重定向。

我的jQuery代碼如下..

$('form').submit(function(e){ 

    var data = $('form').serializeObject(); 
    data.Quality = // this line adds some data from a JSON object. 

    var json = JSON.stringify(data); 

    $.ajax({ 
     url: location.href, 
     type: 'POST', 
     dataType: 'json', 
     data: json, 
     contentType: 'application/json', 
     success: function (data) { 
     $("#jsonOutput").html(json); 
     } 
    }); 

    e.preventDefault(); 
    }); 

這裏是serializeObject功能。

$.fn.serializeObject = function() { 
var o = {}; 
var a = this.serializeArray(); 
$.each(a, function() { 
    if (o[this.name]) { 
    if (!o[this.name].push) { 
    o[this.name] = [o[this.name]]; 
    } 
    o[this.name].push(this.value || ''); 
    } else { 
    o[this.name] = this.value || ''; 
    } 
}); 
return o; 
}; 

這是我的控制器操作。

[HttpPost] 
    public ActionResult Blueprint(Blueprint blueprint) 
    { 
    if (ModelState.IsValid) 
    { 
    using (var context = new Mapping.DataContext()) 
    { 
    context.Blueprints.Add(blueprint); 
    context.SaveChanges(); 

    return Json(Redirect("/List/Blueprints")); 
    } 
    } 

    return View(blueprint); 
    } 

我會發布更多的代碼,如果要求,但我認爲這是所有相關的。我正在使用庫knockoutjs進行模板,如果這是相關的。請告訴我你還有什麼需要看看是否適用。

回答

2
$("#jsonOutput").html(json); 

只要雙重帖子發生,這是因爲請求是由您的事件處理程序和實際的表單提交提交。爲了擺脫這個問題,你想是這樣的:

$('form').submit(function(e){ 

    var data = $('form').serializeObject(); 
    data.Quality = // this line adds some data from a JSON object. 

    var json = JSON.stringify(data); 

    $.ajax({ 
     url: location.href, 
     type: 'POST', 
     dataType: 'json', 
     data: json, 
     contentType: 'application/json', 
     success: function (data) { 
     $("#jsonOutput").html(json); 
     } 
    }); 

    return false; 
    }); 

返回false,會告訴防止事件由形式你告訴你處理它已經被系統處理。

我看到你正在做的另一個問題,你通過設置dataType來請求json:'json'這意味着你的請求期待一個json對象,並且在驗證失敗的情況下,你返回一個滿的視圖。這可能不是你想要做的。

另請注意:

$("#jsonOutput").html(json); 

這是被稱爲成功的響應加載你與你的請求和響應不發送數據的JSON的價值。