2011-06-23 36 views
1

我承認,我很困惑:返回JSON在MVC的Action 3.0

我試圖返回,我已經轉換成JSON的簡單對象如下:

viewModel.updateCoder = function (coder) { 
    var coderJson = ko.toJSON(coder); 
    var coderJsonString = ko.utils.stringifyJson(coderJson); 
    $.ajax({ 
    url: "provider/UpdateCoder", 
    type: 'POST', 
    dataType: 'text', 
    data: coderJsonString, 
    contentType: 'text/csv', 
    success: function() { alert("Updated!"); } 
    }); 

我RouteTable入境看起來是這樣的:

routes.MapRoute(
    "UpdateCoder", 
     "provider/UpdateCoder/{coderDTO}", // URL with parameters 
    new { controller = "Provider", action = "UpdateCoder", coderDTO = UrlParameter.Optional } 
    ); 

我的Controler動作看起來是這樣的:

[AcceptVerbs(HttpVerbs.Post)] 
public string UpdateCoder(string coderDTO) 
{ 
    var rslt = "success"; 
    //var coder = coderDTO.CoderDTOToCoder(); 
    return rslt; 
} 

我得到的UpdateCoder參數(字符串coderDTO)爲空;

這是我的秋天後衛位置,我寧願發送一個JSON對象(coderJson)的動作,但我得到一個錯誤:「此對象定義無參數的構造函數。」當我這樣做,我改變參數類型如下:

[AcceptVerbs(HttpVerbs.Post)] 
public string UpdateCoder(**CoderDTO coderDTO**) 
{ 
    var rslt = "success"; 
    //var coder = coderDTO.CoderDTOToCoder(); 
    return rslt; 
} 

連同:ValueProviderFactories.Factories.Add(新JsonValueProviderFactory());在Global.asax

的CoderDTO類看起來是這樣的:

public class CoderDTO 
{ 
    public Int32 Id { get; set; } 
    public String CoderCode { get; set; } 
    public String Sal { get; set; } 
    public String LName { get; set; } 
    public String FName { get; set; } 
    public String MI { get; set; } 
    public String Facility { get; set; } 
    public String Title { get; set; } 
    public Boolean? IsContract { get; set; } 
    public Boolean? IsInactive { get; set; } 
    public Boolean? IsDeleted { get; set; } 
    public String Comments { get; set; } 
    public String AlternateId { get; set; } 
    public int CasesCoded { get; set; } 

    public CoderDTO(Coder coder) 
    { 
     Id = coder.Id; 
     CoderCode = coder.CoderCode; 
     Sal = coder.Sal; 
     LName = coder.LName; 
     FName = coder.FName; 
     MI = coder.MI; 
     Facility = coder.Facility; 
     Title = coder.Title; 
     if (coder.IsContract != null) IsContract = coder.IsContract; 
     if (coder.IsInactive != null) IsInactive = coder.IsInactive; 
     if (coder.IsDeleted != null) IsDeleted = coder.IsDeleted; 
     Comments = coder.Comments; 
     AlternateId = coder.AlternateId; 
    } 

    public Coder CoderDTOToCoder() 
    { 
     var coder = new Coder 
        { 
         Id = Id, 
         CoderCode = CoderCode, 
         Sal = Sal, 
         LName = LName, 
         FName = FName, 
         MI = MI, 
         Facility = Facility, 
         Title = Title 
        }; 
     coder.IsContract = IsContract ?? false; 
     coder.IsInactive = IsInactive ?? false; 
     coder.IsDeleted = IsDeleted ?? false; 
     coder.Comments = Comments; 
     coder.AlternateId = AlternateId; 
     return coder; 
    } 


} 

的coderJsonString看起來是這樣的:

{"Id":201,"CoderCode":"GP ","Sal":null,"LName":null,"FName":null,"MI":null,"IsContract":false,"IsInactive":false,"Comments":null,"CasesCoded":0,"isBeingEdited":false} 

這是一個漫長的一天!謝謝你的幫助,我正在吃晚飯!

+0

你可以包括與要發佈到控制器的JSON的示例代碼段沿DTO對象? – Jesse

回答

0

我認爲最好的辦法是試圖找出爲什麼你不能反序列化到您的DTO。您至少需要添加一個默認構造函數。

public CoderDTO() { } 

對於字符串傳遞你現在的情況,我認爲你會想這樣稱呼它:

viewModel.updateCoder = function (coder) { 
    var coderJson = ko.toJSON(coder); 
    var coderJsonString = ko.utils.stringifyJson({ coderDTO: coderJson }); 
    $.ajax({ 
    url: "provider/UpdateCoder", 
    type: 'POST', 
    dataType: 'text', 
    data: coderJsonString, 
    contentType: 'application/json; charset=utf-8', 
    success: function() { alert("Updated!"); } 
    }); 

所以,基本上你創建的參數名稱和值的對象,字符串化它。在這種情況下,編碼器Json是雙重編碼的。

+0

RP,謝謝,它的工作爲字符串值。我真的試圖這樣做(包括{coderDTO:coderJson}並沒有奏效也許這是不是在路線可能糾正一些其他設置??不過,這是令人困惑:爲什麼有一個數據類型和我的contentType」米只是接收一個字符串,爲什麼'應用程序/ json'的工作?如果我發送一個看起來不像json的字符串,它會在意嗎?也許它是去吃晚飯和清理我的頭:-)。無論如何,現在談談如何解析字符串化的Json,或者更好的是直接簡單地接收CoderDTO。 - 再次感謝! – Weej

+0

僅供參考,'dataType'描述了你期望收到的內容,而'contentType'描述了你正在發送的內容。當JsonValueProvider發現它接收到的內容類型是JSON時,就會進入它。在這種情況下,您正在發送一個將coderDTO設置爲字符串的對象,並將它與您的參數進行匹配。如果您有關於您當前狀態的更多詳細信息,請隨時提供幫助。理想情況下,你會希望直接在你的動作中接收你的對象(你會希望contentType也是json)。 –

+0

這是非常有用的信息。所以我經常在時間壓力下(或者懶惰)複製/粘貼一些代碼,這種方式會讓它工作。因此我的痛苦和痛苦:-)。用這個信息武裝起來,也許我可以把這個難題放在一起。 - Lou – Weej

0

試着改變你的操作就可以使用JsonResult:

[AcceptVerbs(HttpVerbs.Post)] 
public JsonResult UpdateCoder(CoderDTO coderDTO) 
{ 
    var rslt = "success"; 
    //var coder = coderDTO.CoderDTOToCoder(); 
    return Json(rslt); 
} 
+0

謝謝你,你已經注意到了我的真正目標。我會嘗試,但我的感覺是返回類型不會影響收到的參數。 – Weej