2009-10-11 136 views
1

我正在使用JQuery的getJSON方法從MVC控制器中檢索一些數據。

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult GetContacts(int? numberOf) 
    { 
     List<Contact> contacts = 
      (numberOf != null && numberOf > 0) ? 
       _provider.GetContacts(Convert.ToInt32(numberOf)): 
       _provider.GetContacts(); 

     return Json(contacts); 
    } 

的想法是,我可以使用該控制器的方法,以同時提供所有聯繫人或聯繫人的給定數量,如果「numberOf」被提供。

問題是,當我發送GET請求到「Contacts/GetContacts/5」時,我的控制器中的「numberOf」始終爲空。但是,如果我將GET請求發送到「Contacts/GetContacts /?numberOf = 5」,它將按預期工作。

如果有幫助,這裏的JavaScript方法:

getContacts: function(numberOf){ 
    var path = "/Contact/GetContacts/"; 
     path = (numberOf<=0) ? path : "/Contact/GetContacts/" + numberOf; 

    $.getJSON(path, null, 
     function(json){ 
     $.each(json, function(){  
     $('tbody','#contacts').append(
      "<tr id=\"contact-"+ this.Id +"\">" 
      + "<td>"+ this.Id +"</td>" 
      + "<td>"+ this.FirstName +"</td>" 
      + "<td>"+ this.LastName +"</td>" 
      + "</tr>" 
     ); 
     }); 
    }); 
    }, 

回答

2

你可能有一個路由的問題 - 嘗試運用這兩種修復:

  1. (簡單但也許有點難看)
    numberOf參數重命名爲id,使其能夠被默認路由拾取。

  2. (多一點的工作,但你的代碼會更好看 - 至少在這個方法)
    添加以下路線路線colleciton中的global.asax.cs:

    routes.MapRoute(
        "ContactsRoute", 
        "Contacts/GetContacts/{numberOf}", 
        new { controller = "Contacts", action = "GetContacts", numberOf = null } 
    ); 
    
+0

不認爲這是正確的。如果numberOf爲10,則路徑爲:「/Contact/GetContact/10"...在給定此方法的情況下,沒有對numberOf或id的引用。將{numberOf}添加到路由表不會做任何事情。如果我錯了,請糾正我。 – Amir 2009-10-11 18:01:13

+0

如果傳遞查詢字符串確實工作,那麼肯定看起來像路由問題。 – scottm 2009-10-11 18:32:39

+0

我首先採取了第一種方法,因爲我已經定義了一條路線。你的第一個建議起作用了,所以你說我們是正確的路由問題。根本原因是我在默認路線下定義了我的路線,而不是在上面。因此,請求被路由到默認路由,並且控制器無法映射到參數,因爲它期望'Id'而不是'numberOf'。 感謝Tomas! – Kappers 2009-10-11 18:33:09