【问题标题】:ASP.NET MVC - Routing still confusing for meASP.NET MVC - 路由对我来说仍然令人困惑
【发布时间】:2011-03-15 12:28:15
【问题描述】:

我对 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() 将调用 GetChildFolders() 方法并正确连接并填写 id 参数,但是,使用 TeamChange2() 时,id 参数在控制器方法中保持为空。这一定是导致此问题的路由问题。有什么解释?

【问题讨论】:

标签: jquery asp.net-mvc routing controller


【解决方案1】:

这里实际上不需要路由。事实上,默认路由 {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。 MVC 不关心并且仍然会绑定,因为参数名称与 id 路由参数匹配。观察 FireBug 中的请求以查看差异。

此外,您可以将控制器操作中的 id 参数更改为 Guid 数据类型,这样您就不必在代码中执行 new Guid(id)

【讨论】:

  • 如何在 Firebug 中查看此类请求?那真的很有用。 DOM 标签?
  • 它将在控制台选项卡中。首次加载页面时,请务必打开选项卡。第一种方法应发布到/Upload/GetChildFolders/1234,第二种方法将发布到/Upload/GetChildFolders。如果您展开第二个并查看参数选项卡,您将看到 id: 1234 列出。
【解决方案2】:

试试这个第二个功能。关键是post数据的结构 {名称:值}

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

【讨论】:

    【解决方案3】:

    你能不能像在TeamChange1 中那样在TeamChange2 中构造URL 吗?

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

    我相信这就是我通常的做法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多