ASP.NET MVC - маршрутизация все еще сбивает меня с толку

У меня проблемы с концепцией маршрутизации в ASP.NET MVC Framework. Например, у меня есть метод контроллера:

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 остается нулевым в методе контроллера. Это должно быть проблема маршрутизации, которая вызывает это. Какое объяснение?


person stupidkid    schedule 13.07.2010    source источник
comment
Вы не разместили маршрут GetChildFolders. Я думаю, это то же самое. По другой теме, вас может заинтересовать этот вопрос stackoverflow.com/questions/894779/   -  person dotjoe    schedule 13.07.2010


Ответы (3)


На самом деле вам не нужна маршрутизация. Фактически, маршрут по умолчанию {controller}\{action}\{id} уже соответствует вашему контроллеру, действию и имени параметра (id), поэтому определение UploadRoute является избыточным.

Причина, по которой TeamChange2 () не работает, заключается в том, что id - это строка, а не объект. Правильный код:

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

Это передаст id в коллекции параметров вместо URL-адреса. MVC все равно, и он все равно будет связываться, поскольку имя параметра совпадает с параметром маршрута id. Посмотрите запросы в FireBug, чтобы увидеть разницу.

Кроме того, вы можете изменить свой параметр id в действии контроллера на тип данных Guid, чтобы вам не приходилось делать new Guid(id) в коде.

person Ryan    schedule 13.07.2010
comment
Как мне посмотреть такой запрос в Firebug? Это было бы действительно полезно. Вкладка DOM? - person stupidkid; 16.07.2010
comment
Он будет на вкладке консоли. Обязательно откройте вкладку при первой загрузке страницы. Первый метод должен отправлять сообщения в /Upload/GetChildFolders/1234, а второй - в /Upload/GetChildFolders. Если развернуть второй и посмотреть на вкладку параметров, вы увидите id: 1234 в списке. - person Ryan; 16.07.2010

Попробуйте это для второй функции. Ключевым моментом является структура данных публикации {name: value}

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

Не могли бы вы создать URL-адрес в TeamChange2, как в TeamChange1?

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

Я считаю, что я обычно это делаю именно так.

person TJB    schedule 13.07.2010