2010-07-13 139 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); 
    }); 
} 

我相信这就是我通常这样做的方式。