2010-01-27 2 views
2

У меня есть очень простой проект ASP.Net MVC, где я хотел бы использовать имя параметра id для одного из моих действий с контроллером. Из всего, что я прочитал, это не должно быть проблемой, но по какой-то причине использование имени параметра id не может получить значение, извлеченное из строки запроса, но если я изменю его на любое другое имя, оно будет работать.Параметр id QueryString не используется

У меня есть только один маршрут в моем global.asx

routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
); 

Мой метод контроллера:

public ActionResult Confirm(string id) 
{ 
    .... 
} 

URL-адрес из http://mysite/customer/confirm/abcd работ. Не удалось найти URL-адрес http://mysite/customer/confirm?id=abcd.

Если изменить метод контроллера к:

public ActionResult Confirm(string customerID) 
{ 
    .... 
} 

затем URL из http://mysite/customer/confirm?customerID=abcd работ.

Есть ли что-то особенное в использовании «id» в качестве параметра в строке запроса ASP.Net MVC?

Обновление: Изменен идентификатор от 1234 до abcd, мои идентификаторы - это строки.

+0

Я предполагаю, что значение по умолчанию «» для значения маршрута «id» используется * до * идентификатора, который вы указываете в строке запроса , так как «confirm? id =» соответствует только первым двум значениям маршрута (контроллер и действие). Вопрос в том; зачем вам нужны такие URL-адреса, как «confirm? id =»? Это должно вызвать путаницу; а не только для модуля маршрутизации URL. :) – bzlm

+0

Я надеялся, что смогу сохранить формат URL, который у меня был pre MVC, который использовал id в querystring. – sipwiz

+0

@sipwiz, что подход может вызвать тонкие проблемы. Если вы используете MVC для генерации ссылок, это не будет проблемой. Такие вещи, как «HtmlHelper.ActionLink», известны по маршруту, что означает, что ссылка на метод действия «Подтвердить» с id = 1 в качестве значения маршрута будет отображаться как '/ Confirm/1', а не как' Confirm? Id = 1'. Вам нужно поддерживать устаревшие входящие ссылки, даже для подтверждения? Затем см. Здесь: http://stackoverflow.com/questions/817325/asp-net-mvc-routing-legacy-urls-passing-querystring-ids-to-controller-actions – bzlm

ответ

1

Если вы не применяете параметр ID (либо строки запроса или POST), система просто игнорирует его, и вы можете удалить параметр «ID» в контроллере:

public ActionResult Confirm() 

В вашем случае, вам будет просто придерживаться параметра id. Зачем делать уродливый параметр customerID, когда идентификатор «отображается» автоматически?

Это простой и простой пример использования параметра id.

public ActionResult Confirm(int? id) 
{ 
    if (id.HasValue && id.Value > 0) // check the id is actually a valid int 
     _customerServer.GetById(id.Value); 

    // do something with the customer 

    return View(); 
} 

Это тоже работает для меня. Мы делаем это в нашем приложении прямо сейчас со стандартного маршрута:

public ActionResult Confirm(string id) 
{ 
    if (!string.IsNullOrEmpty(id)) // check the id is actually a valid string 
     _customerServer.GetByStringId(id); 

    // do something with the customer 

    return View(); 
} 
+1

Это действительно то, что я пытался с помощью Confirm (string id). Двигатель MVC работает с id, являющимся int? но не по какой-то причине. – sipwiz

+0

Но вы указали пример id 1234 - это int :-) Вы также можете сделать его «int id». Тогда он не может быть недействителен. Но, несмотря на это, он все равно должен работать с «id», являющимся строкой. Я обновил ответ. – Kordonme

+0

Можете ли вы использовать оба формата URL: customer/confirm/abcd и customer/confirm? Id = abcd, если так, что у вас есть для вашего маршрута в global.asx? – sipwiz

1

Если вам нужен идентификатор в строке запроса, то не создавайте маршрут с параметром 'id'. Если у вас есть маршрут "{controller}/{action}", тогда вы можете использовать public ActionResult Confirm(string id) в качестве своего метода контроллера.

Маршруты не заботятся о строках запроса.

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