2017-09-20 125 views
0

我一直在擺弄dotnetfiddle的默認MVC小提琴。默認情況下會隨機回答任何問題(或輸入非空文本)。我試圖讓它給出包含「誰」這個詞的任何問題的具體答案(「沒有人!」)。

[HttpPost] 
public JsonResult GetAnswer(SampleViewModel qa) 
{ 
    Console.Write(qa); 
    int index = _rnd.Next(_db.Count); 
    if (qa.Question != null) 
    { 
     qa.Answer = qa.Question.Contains("Who") ? "No one!" : _db[index]; 
    } 
    Console.WriteLine(qa); 
    return Json(qa); 
} 

在POST上調用的默認GetAnswer方法有一個名爲question的字符串參數。我不知道爲什麼應該這樣,因爲ajax調用將兩個字符串成員(答案和問題)傳遞給該方法。我已經改變它接受一個SampleViewModel類型的對象,它有兩個字符串成員。

$.ajax({ 
     url: '@Url.RouteUrl(new { action="GetAnswer", controller="Home"})', 
     data: {Answer: "", Question: $('#Question').val()}, 
     type: 'POST', 
     dataType: 'json', 
     contentType: "application/json; charset=utf-8", 
     success: function(resp) { 
        console.log(resp); 
        openAlert(resp.Answer); 
}}); 

我沒有改變那個對象通過。然而,我有擁有,但是,將從方法發回的JSON對象更改爲SampleViewModel obj,然後在ajax成功函數中將對象中的Answer發送給更新跨度中文本的js函數。 (除了在ajax調用中,我沒有改變任何上述的js/jquery代碼)。

問題是,控制器方法似乎總是得到一個空對象傳入。Console.Write()出於某種原因不在這個小提琴工作,但我已經在VS代碼與調試器並證實了這一點。

如何獲得正確傳入方法的對象?

編輯:當我在Chrome開發人員控制檯中檢查$('#Question')。val()時,它確實始終顯示在問題文本框中輸入的文本。

編輯(2):該SampleViewModel定義:

namespace HelloWorldMvcApp 
{ 
    public class SampleViewModel 
    { 
     [Required] 
     [MinLength(10)] 
     [MaxLength(100)] 
     [Display(Name = "Ask Magic 8 Ball any question:")] 
     public string Question { get; set; } 

     //See here for list of answers 
     public string Answer { get; set; } 
    } 
} 
+0

,你能否告訴'SampleViewModel'類的定義是什麼? – ShankarSangoli

+0

@shankar它可以在小提琴中看到,但沒關係,我會將它包含在問題中。 – PakiPat

回答

2

從Ajax調用刪除contentType。如果你使它application/json,你必須stringify。

Updated fiddle

+0

如何將此標記爲答案? – PakiPat

+0

單擊答案左側的複選標記。 ([接受答案:它是如何工作的?](https://meta.stackexchange.com/a/5235/289255)) – adiga