2010-05-10 120 views
3

我有一個接受一個字符串參數的MVC JsonResult方法:MVC JsonResult方法不接受參數

public JsonResult GetDestinations(string countryId) 
    { 
     List<Destination> destinations = new List<Destination>(); 

     string destinationsXml = SharedMethods.GetDestinations(); 
     XDocument xmlDoc = XDocument.Parse(destinationsXml); 
     var d = from country in xmlDoc.Descendants("Country") 
       from destinationsx in country.Elements("Destinations") 
       from destination in destinationsx.Elements("Destination") 
       where (string)country.Attribute("ID") == countryId 
       select new Destination 
       { 
        Name = destination.Attribute("Name").Value, 
        ID = destination.Attribute("ID").Value, 
       }; 
     destinations = d.ToList(); 

     return Json(new JsonResult { Data = destinations}, JsonRequestBehavior.AllowGet); 
    } 

有了一個jQuery方法調用方法:

 //Fetch Destinations 
     $("#Country").change(function() { 
      var countryId = $("#Country > option:selected").attr("value"); 
      $("#Destination").html(""); 
      $("#Resort").html(""); 
      $("#Resort").append($("<option></option>").val(0).html("---Select---")); 
      $.ajax({ 
       type: "POST", 
       traditional: true,      
       url: "/Destinations/GetDestinations", 
       data: "{countryId:'" + countryId + "'}", 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       success: function (msg) { 
        BindDestinationSelect(msg) 
       } 
      }); 
     }); 

然而,JsonResult似乎只接收一個空參數。即使Firebug的顯示出一個參數被傳遞:

JSON countryId 「11」 來源 {countryId:'11' }

任何想法?由於

+0

FWIW,'「{countryId:'」+ countryId +「'}」'不是JSON。 JSON需要雙引號。當我查看Firebug中的POST請求時,您應該真的使用類似http://www.json.org/json2.js的對象序列化爲JSON格式 – R0MANARMY 2010-05-10 15:57:38

回答

1

我認爲這個問題是你如何實際傳遞數據時,你正在做這樣的字符串:

data: "{countryId:'" + countryId + "'}", 

當在現實中,你應該使用在客戶端的結構;

data: { countryId: countryId }, 

jQuery應該能夠正確處理傳遞id然後。正如你現在正在做的那樣,它正試圖將JSON發送到服務器,這不是MVC期望的,而是期望帶有名稱/值對的POST。

您可能還想考慮jQuery Form Plugin,因爲它可以將您的Javascript結構序列化爲POST數據非常容易

+1

,它正在傳遞名稱/值對。當我調用Web服務時(與調用MVC方法相反),傳遞參數的方式非常相似。 – StephenLewes 2010-05-10 16:09:47

1

啊,經過多番搜索,我發現它失敗的原因。

無關,與畸形的JSON等,而是一個事實,即控制器方法犯規知道會發生什麼,如果你試圖通過它的JSON值:

http://www.c-sharpcorner.com/Blogs/BlogDetail.aspx?BlogId=863

所以在我的情況,我我剛剛選擇傳遞一個字符串值。

 $("#Country").change(function() { 
      var countryId = $("#Country > option:selected").attr("value"); 
      $("#Destination").html(""); 
      $("#Resort").html(""); 
      $("#Resort").append($("<option></option>").val(0).html("---Select---")); 
      $.ajax({ 
       type: "POST", 
       traditional: true, 
       url: "/Destinations/GetDestinations", 
       data: "countryId=" + countryId, 
       success: function (msg) { 
        BindDestinationSelect(msg.Data) 
       } 
      }); 
0
public JsonResult BindAllData(string Userid) 
    { 

     List<VoteList> list = new List<VoteList>(); 
     var indexlist = db.TB_WebSites.ToList(); 
     int i = 0; 
     var countlist = db.Tb_Votes.ToList(); 
     var VCountList = db.Tb_Votes.ToList(); 
     foreach (TB_WebSites vt in indexlist) 
     { 
      bool voted = false; 
     } 

     return Json(new { List = _list }); 

    } 


    function DataBind() { 
     $("#LoadingDatas").show(); 
     var userid = $("#FBUserId").text(); 
     //alert('Data : ' + userid); 
     var InnerHtml = ""; 
     $.ajax(
      { 
       url: '/Gitex/BindAllData/', 
       type: 'POST', 
       data: { "Userid": userid }, 
       dataType: 'json', 
       async: true, 
       success: function (data) { 
        //alert('Done'); 
        //alert(data.List.length); 
        for (var i = 0; i < data.List.length; i++) { 

      }); 

    } 

試試這個,它爲我工作 jQuery函數 成功:函數(目的地)

0

在這裏,我建議你來裝飾你的行動HttpPost屬性 ,如: -

[HttpPost] 
public JsonResult GetDestinations(string countryId) 
{ 
    List<Destination> destinations = new List<Destination>(); 

    string destinationsXml = SharedMethods.GetDestinations(); 
    XDocument xmlDoc = XDocument.Parse(destinationsXml); 
    var d = from country in xmlDoc.Descendants("Country") 
      from destinationsx in country.Elements("Destinations") 
      from destination in destinationsx.Elements("Destination") 
      where (string)country.Attribute("ID") == countryId 
      select new Destination 
      { 
       Name = destination.Attribute("Name").Value, 
       ID = destination.Attribute("ID").Value, 
      }; 
    destinations = d.ToList(); 

    return Json(new JsonResult { Data = destinations}, JsonRequestBehavior.AllowGet); 
}