ASP.NET MVC - Маршрутизация все еще сбивает меня с толку - PullRequest
1 голос
/ 13 июля 2010

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

Ответы [ 3 ]

2 голосов
/ 13 июля 2010

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

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

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

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

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

1 голос
/ 13 июля 2010

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

function TeamChange2() {
  $.getJSON('/Upload/GetChildFolders', {id : $('#TeamList').val()}, function(data) {
      bindOptionResults(data);
  });
}
0 голосов
/ 13 июля 2010

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

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

Я полагаю, что я обычно так делаю.

...