默认操作的可选ID

时间:2014-11-15 17:06:15

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

我有一个只有这条路线的网站:

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

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

这是控制器:

public class ImageController : Controller
{
    public ActionResult Image(int? id)
    {
        if (id == null)
        {
            // Do something
            return View(model);
        }
        else
        {
            // Do something else
            return View(model);
        }
    }
}

现在这是默认操作,所以我只需直接访问我的域即可访问它而无需ID。要调用id,它可以通过/ Image / Image / ID工作得很好。然而,我想要的是没有图像/图像(so / ID)调用它。这现在不起作用。

这是默认路由的限制还是有办法让它工作?

由于

1 个答案:

答案 0 :(得分:3)

创建特定于此网址的新路线:

routes.MapRoute(
    name: "Image Details",
    url: "Image/{id}",
    defaults: new { controller = "Image", action = "Image" },
    constraints: new { id = @"\d+" });

请确保在此之前注册上述路线:

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

否则它将无效,因为默认路由优先。

我在这里说明,如果网址包含" / Image / 1"然后执行ImageController/Image动作方法。

public ActionResult Image(int id) { //..... // }

约束意味着{id}参数必须是一个数字(基于正则表达式\d+),因此不需要可为空的int,除非你想要一个可为空的int,在这种情况下,删除约束。