2010-07-13 61 views
1

我在ASP.NET MVC框架內的路由的概念有困難。例如,我有一個控制器的方法:ASP.NET MVC - 路由仍然讓我感到困惑

public class UploadController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult GetChildFolders(string id) 
    { 

     IEnumerable<MyModel> list = MyModelDataContext.GetChildFolders(new Guid(id)); 

     IEnumerable<SelectListItem> listitems = list.Select(row => new SelectListItem 
                  { 
                   Value = row.FolderID.ToString(), 
                   Text = row.FolderName 
                  }); 

     return this.Json(listitems, JsonRequestBehavior.AllowGet); 
    } 
} 

,這裏是我的路線:

routes.MapRoute(
    "UploadRoute", // Route name 
    "Upload/{id}", // URL with parameters 
    new { controller = "Upload", action = "Index", id = UrlParameter.Optional 
}); 

現在,如果我有兩個jQuery函數:

function TeamChange1() { 
    var id = $('#TeamList').val(); 
    $.getJSON('/Upload/GetChildFolders/' + id, null, function(data) { 
     bindOptionResults(data); 
    }); 
} 

function TeamChange2() { 
    var id = $('#TeamList').val(); 
    $.getJSON('/Upload/GetChildFolders', id, function(data) { 
     bindOptionResults(data); 
    }); 
} 

TeamChange1()將調用帶有ID參數的GetChildFolders()方法正確連接並填充,但是,對於TeamChange2(),控制器方法中的id參數仍爲空。這必須是導致此問題的路由問題。什麼是解釋?

+0

您沒有發佈GetChildFolders路由。我想它是一樣的。關於另一個問題,你可能會對這個問題感興趣http://stackoverflow.com/questions/894779/asp-net-mvc-routing-via-method-attributes – dotjoe 2010-07-13 19:48:14

回答

2

您實際上並不需要路由。事實上,默認路由{controller}\{action}\{id}與您的控制器,操作和參數名稱(id)相匹配,因此定義UploadRoute是多餘的。

TeamChange2()不起作用的原因是因爲id是一個字符串,而不是對象。正確的代碼是:

function TeamChange2() { 
    var id = $('#TeamList').val(); 
    $.getJSON('/Upload/GetChildFolders', {id: id}, function(data) { 
     bindOptionResults(data); 
    }); 
} 

這將在params集合中傳遞id而不是url。因爲參數名稱與id路由參數匹配,所以MVC不關心並且仍將綁定。觀看FireBug中的請求以查看差異。

此外,您可以將控制器操作中的id參數更改爲Guid數據類型,因此您不必在代碼中執行new Guid(id)

+0

如何在Firebug中觀看這種請求?這將是非常有用的。 DOM選項卡? – stupidkid 2010-07-16 13:09:54

+0

它將在控制檯選項卡中。第一次加載頁面時一定要打開標籤頁。第一種方法應該發佈到'/ Upload/GetChildFolders/1234'上,第二種方法會發布到'/ Upload/GetChildFolders'上。如果展開第二個參數並查看params選項卡,則會看到列出了id:1234。 – Ryan 2010-07-16 13:33:43

1

嘗試第二種功能。事情的關鍵是後數據 的結構{名稱:值}

function TeamChange2() { 
    $.getJSON('/Upload/GetChildFolders', {id : $('#TeamList').val()}, function(data) { 
     bindOptionResults(data); 
    }); 
} 
0

你能不能構造URL中TeamChange2如您在TeamChange1做?

function TeamChange2() { 
    var id = $('#TeamList').val(); 
    $.getJSON('/Upload/GetChildFolders/' + id, null, function(data) { 
     bindOptionResults(data); 
    }); 
} 

我相信這就是我通常這樣做的方式。