漂亮的URL ASP.NET MVC

时间:2011-01-06 00:16:44

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

如何获得像localhost这样的漂亮网址:8888 / News / Example-post而不是localhost:8888 / Home / Details / 2

My HomeController具有以下详细信息方法

public ActionResult Details(int id)
{
    var ArticleToView = (from m in _db.ArticleSet where m.storyId == id select m).First();

    return View(ArticleToView);

3 个答案:

答案 0 :(得分:9)

由于ASP.NET路由系统有点复杂,因此有很多方法可以实现您所描述的内容。

首先,您是否只想为Details方法提供一个漂亮的URL?如果是这样,您可以考虑将HomeController重命名为NewsController或将Details方法移动到新的NewsController类中 - 将自动形成URL的/News部分。如果您不想要/Details部分,则可以重命名详细信息方法Index,因为/News会自动调用该方法。最后,您需要将int id参数更改为string name

如果您需要许多自定义网址,则必须定义自己的路由。以下是两种方法:

1。 我发现最简单的方法是使用ASP.NET MVC Attribute-Based Route Mapper 。这样,您所要做的就是为每个想要一个漂亮URL的方法添加一个属性,并指定您想要的URL。

首先,您必须按照几个步骤设置基于属性的路线映射系统,如该链接所述。 完成这些步骤后,您必须将方法更改为:

[Url("News/{name}")]
public ActionResult Details(string name)
{
    var ArticleToView = (from m in _db.ArticleSet where m.storyName == name select m).First();

    return View(ArticleToView);
}

2。 或者,您可以Global.asax.cs 中手动定义自定义路线。在RegisterRoutes方法中,您可以在中间添加以下内容:

routes.MapRoute(
                "NewsDetails",                                                   
                "News/{name}",                                 
                new { controller = "News", action = "Details", name = "" }
            );

答案 1 :(得分:1)

我在我的网站上做的是,如果您的网站发布了“本周图片”,我会在页面标题可能具有相同名称的情况下针对页面标题或页面存根检查URL你可能想要使用存根而不是标题,因为你会有多个名为同一个东西。

网址如下所示:http://mySite.com/Page/Verse-of-the-Week

Global.asax包含:

routes.MapRoute("Pages", "{controller}/{pageID}", new { controller = "Page", action = "Index", pageID = "Home" });

PageController是这样的:

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Index(string pageID)
    {
        if (pageID == null)
        {
            pageID = pageRepository.HomeOrLowest();
        }
        var p = pageRepository.ByStub(pageID);
        if (p == null) { return RedirectToAction("NotFound", "Error"); }
        return View(p);
    }

存储库看起来像这样:

    private static Func<mvCmsContext, string, Page> _byStub =
        CompiledQuery.Compile((mvCmsContext context, string pageTitle) =>
            (from p in context.Pages
             where p.pageTitle.Replace(" ", "-") == pageTitle
             select p).SingleOrDefault());
    public Page ByStub(string pageTitle)
    {
        return _byStub(context, pageTitle);
    }

我希望有所帮助。

编辑以添加重复处理:

    private static Func<mvCmsContext, string, int> _pageExists =
        CompiledQuery.Compile((mvCmsContext context, string pageTitle) =>
            (from p in context.Pages
             where p.pageTitle.Replace(" ", "-") == pageTitle
             select p).Count());
    public bool PageExists(string pageTitle)
    {
        return Convert.ToBoolean(_pageExists(context, pageTitle));
    }

验证如下:

        IValidationErrors errors = new ValidationErrors();
        if (CreateOrEdit == "Create")
        {
            if (pageRepository.PageExists(model.pageTitle) && !String.IsNullOrEmpty(model.pageTitle))
                errors.Add("pageTitle", "A page with this title already exists.  Please edit it and try again.");
        }

答案 2 :(得分:0)

请查看我创建的这个包:https://www.nuget.org/packages/LowercaseDashedRoute/ 并在此处阅读单行配置:https://github.com/AtaS/lowercase-dashed-route