ASP.NET MVC вопрос маршрутизации - PullRequest
1 голос
/ 25 марта 2011

У меня простой вопрос о маршрутизации MVC. Как я могу построить Html.ActionLink, который генерирует следующую ссылку http://mysite.com/phones/samsung
Теперь он генерирует как http://mysite.com/phones/brand?brand=samsung
Также я хочу не упоминать название действия в URL
Вот мой код:

Маршрут:

routes.MapRoute(null, "Phones/{brand}", 
new { controller = "Phones", action = "Index", brand = UrlParameter.Optional });

Контроллер:

MySyteDBEntities ms = new MySyteDBEntities();

public ActionResult Index()
{
    ViewBag.Brand = ms.Phones.Select(x => x.Brand).Distinct();
    return View();            
}

public ActionResult Brand(string brand)
{
    ViewBag.Standard = ms.Phones.Where(x => x.Brand == brand).Select(x => x.Standard).Distinct();
        return View();
}

Индекс Посмотреть код:

@foreach (string item in ViewBag.Brand)
{                    
    <div>@Html.ActionLink(item, "Brand", new { brand = item })</div>
}

Ответы [ 5 ]

3 голосов
/ 25 марта 2011

В вашем MapRoute нет места для действия, поэтому asp.net всегда будет использовать действие по умолчанию «Индекс».

По умолчанию ваша маршрутизация будет выглядеть так:

routes.MapRoute(" Default", "{controller}"/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }

Вам не хватает части действия.

Значения маршрута в вашей ссылке, которые не соответствуют параметрам вашего маршрута, будут параметрами строки запроса. Таким образом, вам нужно изменить «категорию» на «бренд» в вашем маршруте.

Попробуйте это:

routes.MapRoute(null, "Phones/{brand}", 
 new { controller = "Phones", action = "Index", brand = UrlParameter.Optional });

и

@foreach (string item in ViewBag.Brand)
{                    
 <div>@Html.ActionLink(item, "Index", "Phones", new { brand = item }, null)</div>
}

Обязательно вызовите контроллер явным образом в вашем ActionLink, если текущее представление отображается через другой маршрут, в противном случае оно не распознает параметр brand.

1 голос
/ 27 марта 2011

Я нашел источник проблемы. Мне просто нужно удалить последний кусок (необязательный параметр бренда) в MapRoute. Заяц это код:

routes.MapRoute(null, "Phones/{brand}", new { controller = "Phones", action = "Brand" });
1 голос
/ 25 марта 2011

Try (этот маршрут должен быть зарегистрирован до маршрута по умолчанию, если он у вас есть)

        routes.MapRoute(
         "Phones", // Route name
         "Phones/{[^(Index)]brand}", // URL with parameters
         new { controller = "Phones", action = "Brand", brand = "" } // Parameter defaults
     );

При этом http://mysite.com/phones/ -> должен перейти к Index Action и http://mysite.com/phones/samsung -> следует перейти к действию бренда.

0 голосов
/ 25 марта 2011

Если я правильно помню, часть {brand} должна быть включена как часть ваших параметров:

routes.MapRoute(null, "Phones/{brand}", 
new { controller = "Phones", action = "Index", brand = UrlParameter.Optional });

Просто помните, она должна идти перед любыми маршрутами по умолчанию.

0 голосов
/ 25 марта 2011
routes.MapRoute(null, "Phones/{id}", 
new { controller = "Phones", action = "Index", id= UrlParameter.Optional })

public ActionResult Brand(string id)
{
    ViewBag.Standard = ms.Phones.Where(x => x.Brand == brand).Select(x => x.Standard).Distinct();
        return View();
}

Использование идентификатора в качестве имени параметра предотвратит использование в маршрутизации пар значений ключей ключа строки запроса.

Ваш код GET и View без параметров по-прежнему должен работать без изменений.

...