MVC路由无法正常工作

时间:2010-08-11 19:39:25

标签: asp.net-mvc asp.net-mvc-routing

更新

有人指出我在路线登记中错过了一个。现在我有一个次要问题。

这就是我希望它发挥作用的方式:

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 个答案:

答案 0 :(得分:3)

你的路线声明中缺少“s”

action =“详情 s

或者在你的行动名称中有一个超过“s”:

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

由你来决定纠正哪一个;)

更新:对于路线更新,请使用:

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

因此,当您键入/ products时,将使用“默认”路由。

答案 1 :(得分:2)

因为您已经为idproductName定义了默认值,所以路由引擎只会在缺少时为您填写,因此您对/ products的请求会将这些默认值插入并转到详情行动。

取出:id = 0, productName = "",您将获得预期的行为。

修改

考虑在那里有一个{action}参数。由于您有默认操作而无法覆盖它,因此无论如何都可以将所有内容都路由到详细信息。