ASP.NET MVC路由约束正则表达式

时间:2018-09-05 12:07:33

标签: regex asp.net-mvc-5 asp.net-mvc-routing dynamic-pages

我想根据页面标题使用不带控制器和操作的url服务器动态页面
默认网址:domain.com/pages/details/1
我希望它作为服务器
domain.com/title-of-dynamic-page-in-db-space-replaced-with-dash
domain.com/about-us
domain.com/contact-us

如果我在不使用破折号的情况下执行此操作,则路由会与controller名称混淆
那就是为什么我为动态页面添加破折号-

我的动作看起来像这样

    // GET: Pages/View/5
    public ActionResult View(string id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Page page = db.Pages.First(p => p.name_english == id.Replace("-"," "));
        if (page == null)
        {
            return HttpNotFound();
        }
    }

我的路线是

        routes.MapRoute(
            name: "aaaaa",
            url: "{id}",
            defaults: new { controller = "pages", action = "view" },
            constraints: new { id = @"^[A-Za-z\d-]+$" } //*********help needed in this line ******************************
        );


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

约束^[A-Za-z\d-]+$上方
接受alpha(optional) numeric(optional)dash(optional)

我需要alpha(optional) numeric(optional)dash(*mandatory*)

通过这种方式,路由引擎不会将页面标题与控制器/操作混淆,因为我将确保我的动态页面名称包含空格(我用破折号代替)
并且我的控制器/动作将不会被命名为包含破折号

还告诉我,这种方法是否可行,是否还有其他优化的解决方案?

1 个答案:

答案 0 :(得分:0)

我希望以下代码段对您有用。

    routes.MapRoute(
        name: "aaaaa",
        url: "{id}",
        defaults: new { controller = "pages", action = "view" },
        constraints: new { id = @"^([-]*[a-zA-Z0-9]*-[a-zA-Z0-9]*[-]*)+$" } //*********this should work**
    );

    //---------------------------------------
    // ^([-]*[a-zA-Z0-9]*-[a-zA-Z0-9]*[-]*)+$
    //---------------------------------------
相关问题