2012-11-26 40 views
1

我想改變:操作命中MVC後更改URL?

www.testurl.com/sports/blog/1 

當運動是我的領域,博客是我的行動,1是一個博客帖子的ID,以:

www.testurl.com/sports/blog/test-title-of-blog 

哪裏博客仍然是我的行動,但該ID未顯示,而是博客的標題/永久鏈接是。

這裏是我的這個動作AreaRegistration:

context.MapRoute(
       "sports", 
       "sports/{action}/{content}", 
       new { area = "Sports", controller = "Sports", action = "", content = "" }); 

這是我此刻的動作:

[HttpGet] 
    public ActionResult Blog(string content) 
    { 
      int contentId; 
      if (Int32.TryParse(content, out contentId)) 
      { 
       model = service.GetBlogById(contentId); 
      } 
      else 
      { 
       model = service.GetBlogByTitle(content); 
      } 

      //Change URL to be: www.testurl.com/sports/blog/ + model.SEOFriendlyTitle 
      return View(model);    
    } 

用戶可以通過博客的ID進行搜索,同時也得到了它的標題,但我只想要標題出現在url欄中,從來沒有id。

由於會導致持續的維護,我無法通過重定向規則執行此操作。

  1. 控制器是否是正確的位置? - 請注意我可能沒有我的頭銜,直到後,我使用的ID

  2. 我怎麼會去改變URL顯示標題主場迎戰ID檢索數據庫中呢?

回答

1

,我認爲你應該做的是返回如果ID是數字並且是有效的contentId,則將其重定向到新的Url:

  int contentId; 
      if (Int32.TryParse(content, out contentId)) 
      { 
       model = service.GetBlogById(contentId); 
       if(model != null) 
       { 
        return RedirectResult(/*url using the title*/); 
       } 
      } 
      else 
      { 
       model = service.GetBlogByTitle(content); 
      } 

      //Change URL to be: www.testurl.com/sports/blog/ + model.SEOFriendlyTitle 
      return View(model); 

當然,這將導致另一次往返服務器,但我可以看到一種方法來更改瀏覽器URL而無需頁面重定向。您還應該確保您網站上的所有已發佈網址都使用標題而不是標識。

我希望這會有所幫助。

+0

這正是我所做的。我也想到第二次去數據庫和服務器,但可以通過在tempData中傳遞對象並檢查是否存在,從而避免數據庫調用。這是一個非常邊緣的情況,網站上的所有網址都是頁面標題......我只是希望能夠支持ID而不是標題。這是可以接受的答案,因爲它解決了我所遇到的問題(儘管可能會導致其他問題:P) – JCisar

0

我建議給這個快速閱讀。

http://www.dominicpettifer.co.uk/Blog/34/asp-net-mvc-and-clean-seo-friendly-urls

如果你真的不能在URL中的ID,不想做重定向那麼我認爲存儲地址蛞蝓在數據庫中是唯一的選擇。

* 有些要點,如果你打算這樣做。 *

  1. 在數據庫級別添加的唯一約束的列以避免重複。

  2. 在此列上創建數據庫索引以加快讀取速度。

這個網址

所以

www.testurl.com/sports/blog/test-title-of-blog 

這是你唯一的蛞蝓,你將在數據庫中查詢,而不是一個ID

test-title-of-blog 
+0

好文章,很可能會更新爲使用ID,但必須有標題。我想我想知道的是,如果有一些MVC類可以用來編輯操作中的url。 – JCisar