ASP.NET MVC: методы действий с одним параметром без имени ID и нецелым числом - PullRequest
0 голосов
/ 23 сентября 2009

Рассмотрим проект ASP.NET MVC 1.0 с использованием соглашения об областях, как описано в этом ноябрь. Сообщение в блоге Фила Хаака 2008 года . Это решение прекрасно работает после его установки!

Моя проблема начинается с моего ограниченного знания правил маршрутизации ASP.NET MVC.

Мое намерение - создать метод действия и структуру URL следующим образом:

http://mysite/Animals/Dogs/ViewDog/Buster

DogsController.ViewDog() выглядит так:

public ActionResult ViewDog(string dogName)
{
     if (dogName!= null)
     {
         var someDog = new DogFormViewModel(dogName); //snip a bunch more

         return View(someDog);
     }
     else { return View("DogNotFound"); }           
}

Задача состоит в том, чтобы убедиться, что RegisterRoutes() содержит правильные записи.

UPDATE

Вот новый отображаемый маршрут:

routes.MapRoute("ViewDog", "Animals/{controller}/{action}/{dogName}",
                                     new { controller = "Dogs", 
                                           action = "ViewDog", dogName = "" });

Создана ссылка на URL:

<%= Html.RouteLink("Brown Buster", "ViewDog", new RouteValueDictionary(new { controller="Dogs", action="ViewDog", dogName="Buster" }))%>

URL создан, как и ожидалось. Спасибо Крейгу Штунцу и его сообщению в блоге Html.RouteLink.

http://mySite/Animals/Dogs/ViewDog/Buster

Новая проблема: Параметр dogName не извлекает строковое значение "Buster" из URL. Вызов метода успешен, но аргумент оценивается как ноль.

Вопросы

Как вы можете:

  • заставить этот маршрут работать со строкой и удалить соглашение по умолчанию int id в маршруте? Я бы хотел изменить имя параметра на int.

Ответы [ 2 ]

1 голос
/ 23 сентября 2009

Вы уверены, что ActionLink действительно соответствует маршруту, на который вы указываете им вопрос? Если у вас более одного маршрута, я настоятельно рекомендую использовать RouteLink вместо ActionLink, , как я подробно объясню в этом посте . Когда вы используете RouteLink, нет никакой вероятности, что вы найдете неправильный маршрут, по крайней мере, при генерации URL.

0 голосов
/ 23 сентября 2009

Параметр по умолчанию "id" не обязательно должен быть int. Это будет соответствовать любому типу, который вы объявляете в вашем методе действия. Почему бы просто не сделать следующее?

public ActionResult ViewDog(string id)
{
     if (id!= null)
     {
         var someDog = new DogFormViewModel(id); //snip a bunch more

         return View(someDog);
     }
     else { return View("DogNotFound"); }           
}
...