2010-06-01 87 views
3

我建立一個基本的博客應用程序剛纔,因爲我只是用默認路由查看數據,即 -ASP.NET MVC - 在URL中隱藏ID?

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

所以,當你去到mysite.com/View/12它顯示的具有ID的博客12.我想修改這些URL,使其看起來如下所示:mysite.com/View/2010/06/01/this-is-the-title。

我能有一個URL映射像 -

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

但後來我沒有通過ID到控制器動作,所以我不得不在這感覺不對的日期和標題進行搜索。另一方面,如果我傳遞了ID,它將顯示在URL中,而這不是我想要的。有沒有辦法在控制器動作中只傳入ID作爲參數後重定向到我想要的URL,或者將ID傳遞到Map Route但將其隱藏在URL中?

感謝您的幫助!

回答

2

當您在博客文章中創建標題字段時,請預先生成網址安全標題並將其放置在博客表中的柱狀圖中。然後,您可以選擇該選項,並將日期與輸入相匹配以確保(對於重複項)。

雖然,大多數博客雖然像

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

+0

這可能是最安全的。(日期沒有必要,但也許你有這樣的組織的原因。) – 2010-06-02 03:50:33

+0

有些人喜歡描述性的網址。 – Aren 2010-06-02 15:41:25

+0

謝謝,我將與此同去!我會考慮將id放入標題中,但如果我要這樣做,那麼我可能只需將id作爲參數傳遞即可。 – mcfroob 2010-06-02 17:03:19

1

你的URL映射想法其實是做正確的事。您可以忽略年/月/日(但請確保您輸入URL約束以僅匹配正確大小的數字)。因此,如果標題保證是唯一的(通過您的模型約束),那麼您的控制器操作方法可能只關心標題。只要確保你的數據庫索引標題字段快速搜索。

正如Aren所說,最常見的是擁有一個'slug'字段,它可以獲得帖子標題並使其安全並將其保存在該狀態。

如果你確實想要,你也可以使用通配符映射(例如「blog/{slug *}」),這個映射會將URL中的所有內容映射爲寫入的內容,而不是使用斜槓作爲分隔符,所以blog/2010/02/05/my-title會作爲字符串參數傳遞給actionmethod,等於「2010/02/05/my-title」

0

雖然我在URL中顯示了ID,但我做了類似的操作。您可以在從默認網址路由的操作中檢查ID,然後將其重定向到閃亮的網址。

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可以做到這一點。

0

當傳入ID時,我設置了一個會話變量,然後將用戶重定向到讀取會話變量的另一個控制器ActionResult。這是一個令人討厭的黑客攻擊,但是在URL中顯示ID也很煩人。您在下面看到的SessionVariables類僅僅是一個靜態屬性類,它被設置爲會話變量。

最終結果 - 使用會話變量重定向到沒有ID的視圖。

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); 
    }