ASP.NET MVC - скрытие идентификатора в URL? - PullRequest
3 голосов
/ 01 июня 2010

Я сейчас создаю базовое приложение для блога, для просмотра данных я просто использую маршрут по умолчанию, т.е. -

routes.MapRoute
(
     "Default", // Route name
     "{controller}/{action}/{id}",
     new { controller = "Blog", action = "Index", id = UrlParameter.Optional } 
);

Чтобы при переходе на mysite.com/View/12 отображался блог с идентификатором 12. Я хочу изменить URL-адреса так, чтобы они выглядели следующим образом: mysite.com/View/2010/06/01/this -is-The-заголовок.

У меня могло бы быть отображение URL как -

        routes.MapRoute(
            "View",
            "View/{year}/{month}/{day}/{title}",
            new { controller = "Blog", action = "View" }
        );

Но тогда я не передаю идентификатор в действие Controller, поэтому мне придется искать дату и заголовок, который кажется неправильным. С другой стороны, если я передам идентификатор, он будет отображаться в URL-адресе, к которому я не стремлюсь. Есть ли способ перенаправить на URL, который я хочу в действии контроллера, после передачи только идентификатора в качестве параметра или передать идентификатор в маршрут карты, но скрыть его в URL?

Спасибо за вашу помощь!

Ответы [ 4 ]

2 голосов
/ 01 июня 2010

Когда вы вносите поле «Заголовок» в сообщения блога, предварительно сгенерируйте заголовок, безопасный для URL, и поместите его в столбец в таблице блога. Затем вы можете выбрать и сопоставить дату с вводом, чтобы быть уверенным (для дубликатов).

Хотя, большинство блогов, как и

/2010/05/31/23343-the-topic-has-the-id-in-it

1 голос
/ 01 июня 2010

Ваша идея сопоставления URL на самом деле правильная вещь. Вы можете игнорировать год / месяц / день (хотя убедитесь, что вы вставили ограничения URL, чтобы соответствовать только числам правильного размера). Таким образом, ваш метод действия контроллера может заботиться только о заголовке, если заголовок гарантированно будет уникальным (через ограничения модели). Просто убедитесь, что ваша БД индексирует поле заголовка для быстрого поиска.

Как сказал Арен, обычно также есть поле 'slug', которое берет заголовок сообщения, делает его URL безопасным и сохраняет его в этом состоянии.

Если вы действительно хотите, вы также можете использовать сопоставление с подстановочными знаками (например, «blog / {slug *}»), которое сопоставит все остальное в URL как написано, не используя косые черты в качестве разделителей, поэтому blog / 2010 / 02/05 / my-title будет передан в actionmethod в виде строкового параметра, равного «2010/02/05 / my-title»

0 голосов
/ 25 июля 2013

Когда передается идентификатор, я устанавливаю переменную сеанса, а затем перенаправляю пользователя на другой контроллер ActionResult, который читает переменную сеанса. Это раздражающий хак, но также раздражает отображение идентификаторов в URL. Класс SessionVariables, который вы видите ниже, является просто классом статических свойств, которые получают / устанавливают переменные сеанса.

Конечный результат - перенаправить в представление без идентификатора с помощью переменных сеанса.

public ActionResult ViewContext(Int64 ContextID)
    {

        SessionVariables.the_context = "UserView";
        SessionVariables.the_context_id = ContextID;

        return RedirectToAction("ViewWithNoID");
    }

    public ActionResult ViewWithNoID()
    {
        //Change this to UserView

        Security_User obj = Security_User.getByPK(SessionVariables.the_context_id);

        return View("View", obj);
    }
0 голосов
/ 02 июня 2010

Я сделал что-то подобное, хотя показывал идентификаторы в URL. Вы можете проверить идентификатор в действии, перенаправленном с URL-адреса по умолчанию, а затем перенаправить его на блестящий.

public ActionResult Index(int id)
{
    BlogPost blogPost=blogRepository.GetPost(id);
    TempData["post"]=blogPost;
    //this makes sure post is stored in memory so it doesn't get to database again
    return Redirect("/View/"+blogPost.year+"/"+blogPost.month+"/"+blogPost.day+"/"+blogPost.title);
}

public ActionResult View(int year, int month, int day, string title)
{
    if(TempData["post]"==null)//I assume you will publish links with that URL, so someone can be routed here without redirecting
    {

        BlogPost blogPost=blogRepository.GetPost(title);
        return View(blogPost);
    }
    else 
        return View(TempData["post"]);
}

Я думаю, что вам лучше также публиковать ссылки с датой, чтобы проверить дату и заголовок для получения данных, но это выглядело бы лучше В любом случае, если вы просто хотите использовать ID, Redirect и TempData могут решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...