2010-07-13 2 views
1

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

+0

Вы не разместили маршрут GetChildFolders. Я думаю, это одно и то же. По другому вопросу вам может быть интересен этот вопрос http://stackoverflow.com/questions/894779/asp-net-mvc-routing-via-method-attributes – dotjoe

ответ

2

Вам действительно не нужна маршрутизация здесь. Фактически маршрут по умолчанию {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).

+0

Как посмотреть этот вид запроса в Firebug? Это было бы очень полезно. Вкладка DOM? – stupidkid

+0

Он будет на вкладке консоли. Обязательно откройте вкладку при первой загрузке страницы. Первый метод должен размещаться в '/ Upload/GetChildFolders/1234', а второй - в'/Upload/GetChildFolders'. Если вы разберете второй и посмотрите на вкладку params, вы увидите список «id: 1234». – Ryan

1

Попробуйте это для второго func. Главное, структура разместить данные {имя: значение}

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); 
    }); 
} 

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

Смежные вопросы