Симпатичный URL ASP.NET MVC - PullRequest
       8

Симпатичный URL ASP.NET MVC

1 голос
/ 06 января 2011

Как я могу получить красивые URL, как localhost: 8888 / Новости / Пример поста вместо localhost: 8888 / Home / Details / 2

My HomeController имеет следующее для метода Details

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

    return View(ArticleToView);

Ответы [ 3 ]

9 голосов
/ 06 января 2011

Поскольку система маршрутизации ASP.NET несколько сложна, есть много способов выполнить то, что вы описываете.

Прежде всего, вы просто хотите иметь симпатичный URL для метода Details? Если это так, вы можете подумать о переименовании HomeController в NewsController или о переносе метода Details в новый класс NewsController - это будет автоматически формирует часть URL /News. Если вам не нужна деталь /Details, вы можете переименовать ваш метод Details Index, так как он будет автоматически вызываться /News. Наконец, вам нужно изменить параметр int id на string name.

Если вам нужно много пользовательских URL-адресов, вам нужно определить свои собственные маршруты. Вот два способа сделать это:

1. Самый простой способ, который я нашел, это использовать ASP.NET MVC на основе атрибутов 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 голос
/ 06 января 2011

Что я делаю на своих сайтах, так это то, что я сравниваю URL с заголовком страницы или заглушкой в ​​тех случаях, когда заголовки страниц могут иметь одно и то же имя, например, если у вас есть сайт, который публикует «Картинку недели» Вы можете захотеть использовать заглушку вместо заголовка, так как у вас будет несколько имен с одинаковыми именами.

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.");
        }
0 голосов
/ 04 августа 2013

Пожалуйста, проверьте этот пакет, который я создал: https://www.nuget.org/packages/LowercaseDashedRoute/ И прочитайте однострочную конфигурацию здесь: https://github.com/AtaS/lowercase-dashed-route

...