2014-11-07 2 views
3

Вопрос фон:ASP.NET MVC ActionLink не выбирая правильный контроллер

Я пытаюсь передать переменную - в этом случае в Int «PRODUCTID» переменная»в URL для контроллера и действия метод, указанный в методе ActionLink.

Вопрос:

Мои маршруты устанавливаются следующим образом:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Login", action = "Login", id = UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      name: "ProductDetailHandler", 
      url: "{controller}/{action}/{productId}", 
      defaults: new { controller = "Product", action = "ProductDetail", productId = UrlParameter.Optional } 
     ); 

Мой 'ActionLink' на мой взгляд 'Products.cshtml' - который возвращается контроллером под названием ' HomePageController 'устанавливается следующим образом:

@Html.ActionLink("Product", "ProductDetail", new { productId = (ViewBag.data as List<LoginTest.Models.HomePageItem>).First().Id }) 

Контроллер, который получает пропуск Эда «ProductID» наряду с методом действия устанавливается следующим образом:

public class ProductController : Controller 
{ 
    public ActionResult ProductDetail(int productId) 
    { 
     //logic 

     return View(); 
    } 
} 

Это вопрос, если смотреть на URL показано, будет перенаправлять на контроллер для домашней страницы:

'

Если кто-то может сказать мне, почему мой ActionLink является не собирается контроллер Продукт, что было бы здорово.

EDIT:

Это мнение для домашней страницы, что я нажимаю кнопку, чтобы перенаправить меня к 'продукт/ProductDetail/PRODUCTID'

enter image description here

Мой маршрут теперь просто используется «пример по умолчанию»:

routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Login", action = "Login", id = UrlParameter.Optional } 
     ); 

Действие Ссылка теперь:

@Html.ActionLink("Product", "ProductDetail", "Product", new { id = (ViewBag.data as List<LoginTest.Models.HomePageItem>).First().Id }) 

«ProductDetail Продукт /» контроллер и действие метод теперь выглядит следующим образом:

public class ProductController : Controller 
{ 
    public ActionResult ProductDetail(int id) 
    { 
     string hold; 

     return View(); 
    } 
} 

Это еще дает мне неверный URL, как показано на рисунке, Заметьте, что «productId» теперь отображается как «длина»?

enter image description here

+0

У вас есть другие маршруты в файле маршрута? По умолчанию маршрут контроллера/action/id должен работать. Вам не нужны настраиваемые маршруты, которые в основном одинаковы. Также в вашем примере productid также не должен отображаться в строке запроса. – Kirby

+0

@Kirby Я добавил все содержимое своего маршрута RouteConfig.cs – user1352057

+1

Переместите ваш маршрут «ProductDetailHandler» до «Default» и измените URL-адрес на «url:« Product/ProductDetail/{productId} »или просто удалите маршрут и измените метод на 'ProductDetail (int id) –

ответ

2

Поскольку ссылка на страницу, вынесенным HomePageController по умолчанию использовать этот контроллер в маршруте. Вы должны использовать перегрузку, которая принимает имя контроллера

@Html.ActionLink("Your link text", "ProductDetail", "Product", new { id = 1 }, null) 

В качестве примечания, исходная таблица маршрутизации создала бы /Product/ProductDetail?productId =1 с этой перегрузкой, поскольку он соответствует маршруту по умолчанию, который является первым маршрутом в вашей таблице (порядок маршрутов важен). Для того, чтобы иметь /Product/ProductDetail/1, либо изменить порядок маршрутов или просто изменить параметр ProductDetail к int id, а не int productId

0

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

routes.MapRoute(
    name: "ProductDetailHandler", 
    url: "Product/{action}/{productId}", 
    defaults: new { controller = "Product", action = "ProductDetail", productId = UrlParameter.Optional } 
); 

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

Не уверен, что вы пытаетесь сделать с Вход контроллера. Возможно, вы можете войти на свою домашнюю страницу или перенаправить Home/Index на Login.

Также вы можете указать пространство имен по умолчанию, если он не находит контроллер:

routes.MapRoute(
    name: "ProductDetailHandler", 
    url: "Product/{action}/{productId}", 
    defaults: new { controller = "Product", action = "ProductDetail", productId = UrlParameter.Optional }, 
    new string[] { "MyProject.Controllers" } 
); 

routes.MapRoute 
(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    new string[] { "MyProject.Controllers" } 
); 
0

Убедитесь, что вы используете перегрузку, которая имеет controllerName в нем, как показано на следующем скриншоте.

enter image description here

Когда я удалить routeValues: null, он использует другой overlaod который имеет routeValue в качестве третьего В параметре.

enter image description here

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