2012-03-06 114 views
0

我有我的控制器的工作方式,此時URL出現Home/Collections/Collection?id=1這是我的目標功能。不過,我現在想讓網址更友好。例如,我希望它變成Home/Collections/SummerMVC控制器

我在CollectionsController下面的代碼:

public ActionResult Index() 
    { 
     return View(Helper.Helper.ResolvePath("Collections")); 
    } 


    // 
    // GET: /Collections/Collection?id=1 
    public ActionResult Collection(int id) 
    { 
     var collectionModel = ds.GetCollection(id); 
     return View(Helper.Helper.ResolvePath("Collection"), collectionModel); 
    } 

需要什麼改變讓我想要的結果?沒有單獨的ActionResult爲每個集合(因爲它永遠不會是一個固定的數字)?

這裏是我的Global.asax

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

    } 
+0

張貼您的路線收集。您很可能需要添加或修改您的路由,以便在控制器的操作方法中接受字符串而不是int參數。 – asawyer 2012-03-06 14:21:58

+0

@asawyer編輯 – ediblecode 2012-03-06 14:27:15

+0

@danRhul「夏季」與「1」的ID值有什麼關係?是「夏季」收藏品的名稱嗎?您是否希望此路線僅適用於這一個控制器操作?通過使用自定義路由約束,您可以做到這一點,但在我給出示例代碼以說明如何做到這一點之前,我需要您澄清一下。 – 2012-03-06 14:34:31

回答

2

你可以這樣定義的路由,

routes.MapRoute(
      "Collections", // Route name 
      "Collections/{name}/{id}", // URL with parameters 
      new { controller = "Collections", action = "Collection" ,id = UrlParameter.Optional } // Parameter defaults 
     ); 

現在,在您CollectionsController,

public class CollectionsController : Controller 
{  
    public ActionResult Collection(string name) 
    { 
     /// Your Logic here 
     /// name is required parameter 
     /// optionally you can add an id parameter 
     return View(); 
    } 

} 

現在,您的網址就會像「HTTP://本地主機:98765/Collections/Summer「

但我不知道爲什麼你需要首頁在url中

+0

沒有必要在網址首頁只是把它放在那裏,讓人們可以理解 – ediblecode 2012-03-06 14:45:59

0

更改id參數爲字符串,並盡一切數據庫查詢必須找到相應的ID。

+0

對於Collection ActionResult?這不會讓它出現'家/收藏/集合?(字符串名稱)=名稱' – ediblecode 2012-03-06 14:19:08

+0

@danRhul:編號MVC僅通過參數名稱匹配路線。無論「id」是什麼類型,它都將與路由中的參數「{id}」匹配。您可以通過編輯路線來允許不同的參數名稱。 – SLaks 2012-03-06 14:22:03

+0

你能提供一個代碼示例嗎? – ediblecode 2012-03-06 14:29:45

-2

有這樣主頁的URL /收藏/夏季,你需要有一個名爲「夏」的方法,而且你可以把它與相應的ID返回的ActionResult到夏季,像這樣:

public ActionResult Summer() { 
    return Collection(1); //where id 1 corresponds to summer 
} 
+0

「每個集合沒有單獨的ActionResult(因爲它永遠不會是一個固定的數字)?」 – ediblecode 2012-03-06 14:24:12

1

鑑於以下enum

public enum Seasons { Summer = 1, Fall = 2, Winter = 3, Spring = 4 } 

添加自定義路線以路線映射:

routes.MapRoute(
    "Default", // Route name 
    "Home/Collections/{action}/{season}", // URL with parameters 
     new { controller = "Collections", 
       action = "Collection", 
       season = UrlParameter.Optional } // Parameter defaults 
); 

控制器動作:

public ActionResult Collection(Season season) 
{ 
    /* ... code ... */ 
} 
+0

控制器不是家庭,而是集合。我也不能在數據庫中指定Seasons時使用枚舉 – ediblecode 2012-03-06 14:26:09

+0

@danRhul使用枚舉映射數據庫中定義的整數值... – xandercoded 2012-03-06 14:27:57

+0

季節可以在數據庫中進行編輯。它現在可能是夏天,它可能是夏季/秋季,它會不斷變化 – ediblecode 2012-03-06 14:29:11

-1

隨着Manas的答案,你可以有一個額外的「字段/列/屬性」您的集合保存一個URL友好名稱。

並不是所有的名稱將是URL的有效名稱(例如,如果你的收藏是「50%優惠!」,你一定會得到意外的結果的URL http://server/Collections/50%優惠!!)

所以,你可能想嘗試添加「UrlFriendlyName」到您的收藏,並從正式名稱自動生成它:

public class Url 
{ 
    public static string GetUrlFriendlyName(string name) 
    { 
     //Unwanted: {UPPERCASE} ;/? : @ & = + $ , . ! ~ * ' () 
     name = name.ToLower(); 
     //Strip any unwanted characters 
     name = Regex.Replace(name, @"[^a-z0-9_\s-]", ""); 
     //Clean multiple dashes or whitespaces 
     name = Regex.Replace(name, @"[\s-]+", " "); 
     //Convert whitespaces and underscore to dash 
     name = Regex.Replace(name, @"[\s_]", "-"); 
     name = Regex.Replace(name, @"-+", "-"); 
     return name; 
    } 
} 

這樣,您可以根據URL友好名稱(理想情況下查詢您的收藏,這將是獨一無二的,但一其他許多擔憂都會發揮作用...例如將URL添加到URL(http://server/Collections/Summer/1或將隨機數字添加到URL友好名稱,如http://server/Collections/Summer-123或者只是讓創建集合的用戶指定一個唯一的URL友好名稱,從自動生成的名稱開始,但如果不是則返回給用戶獨特)。