MVC Route не работает - PullRequest
       6

MVC Route не работает

4 голосов
/ 11 августа 2010

Обновление:

Как кто-то указал, я пропустил s при регистрации в Route. Теперь у меня есть второстепенная проблема.

Вот как я хочу, чтобы это работало:

http://localhost/products/ -> ProductsController.Index ()

http://localhost/products/3/apples -> ProductsController.Details (int? Id, string productName)

Вот что сейчас происходит:

http://localhost/products переходит к действию «Мои данные».

Как мне настроить маршруты для этого?

Я установил следующие маршруты в моем файле Global.asx:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "ViewProduct",
        "products/{id}/{productName}",
        new { controller = "Products", action = "Details", id = 0, productName = "" } // Parameter defaults
    );

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

У меня есть следующий контроллер:

public class ProductsController : Controller
{
    //
    // GET: /Products/

    public ActionResult Index()
    {
        IList<Product> products = new List<Product>
        {
            new Product { Id = 57349, ProductName = "Apple" },
            new Product { Id = 57350, ProductName = "Banana" }
        };

        return View(products);
    }

    public ActionResult Details(int? id, string productName)
    {
        Product p = new Product { Id = id.Value, ProductName = productName };

        return View(p);
    }
}

Ответы [ 2 ]

3 голосов
/ 11 августа 2010

Вы пропустили "s" в объявлении маршрута

action = "Detail s "

Или в названии вашего действия должен быть один символ "s":

public ActionResult Detail s (int? Id, string productName)

Вам решать, какой из них исправить;)

Обновление: для обновления маршрута просто используйте:

routes.MapRoute(
    "ViewProduct",
    "products/{id}/{productName}",
    new { 
        controller = "Products", 
        action = "Details" }
);

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

2 голосов
/ 12 августа 2010

Поскольку вы определили значения по умолчанию для id и productName, механизм маршрутизации просто заполняет их для вас, когда они отсутствуют, поэтому ваш запрос к / products вставляет эти значения по умолчанию и переходит к действию details.

Уберите: id = 0, productName = "", и вы получите ожидаемое поведение.

edit

Подумайте о наличии параметра {action} там.Поскольку у вас есть действие по умолчанию, и вы не можете его переопределить, вы все равно можете перенаправить все на детали.

...