2

ASP.NET MVC 4 网站。

有一个名为“Locations”的数据库表,它只包含三个可能的位置(例如“CA”、“NY”、“AT”)默认路由是:

http://server/Location/  --- list of Locations
http://server/Location/NY --- details of NY-Location

如何在没有 /Location/ - 位的情况下创建自定义路线?(我觉得更好一点)

以便

http://server/NY - details of NY
http://server/AT - details of AT
.... etc...

http://server/Location  --- list of Locations
4

2 回答 2

7

一种解决方案是使用路由约束进行自定义路由:(顺序很重要)

routes.MapRoute(
    name: "City",
    url: "{city}",
    constraints: new { city = @"\w{2}" },
    defaults: new { controller = "Location", action = "Details", id = UrlParameter.Optional }
);

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

使用匹配的控制器:

public class LocationController : Controller
{
    //
    // GET: /Location/
    public ActionResult Index()
    {
        return View();
    }

    //
    // GET: /{city}
    public ActionResult Details(string city)
    {
        return View(model:city);
    }
}

如果您只想允许 NY、CA 和 AT,您可以编写路由约束,例如:

constraints: new { city = @"NY|CA|AT" }

(小写也可以)。另一个更通用的解决方案而不是使用路由约束是实现你自己的IRouteConstraint. 看我之前的回答

于 2012-09-20T18:42:12.290 回答
0

您需要在控制器内指定路由。查看本教程,了解如何指定路由约束:

http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs

您使用路由约束来限制与特定路由匹配的浏览器请求。您可以使用正则表达式来指定路由约束。

另请看这篇文章:如何将 /News/5 的路由映射到我的新闻控制器

于 2012-09-20T18:17:00.203 回答