2009-01-05 135 views
2

我正在使用MVC測試版編寫一個簡單的應用程序來理解ASP.Net MVC。該應用程序是一個簡單的照片/視頻共享網站與標記。我正在開發MVC框架項目。我在導航欄中添加了一些Html.ActionLink(),但是我在其中一個Html.ActionLink()中添加了一個問題。ASP.Net MVC Html.ActionLink()問題

我想〜/標籤顯示數據庫中的所有標籤,我希望〜/標籤/ {標籤}顯示所有使用{標籤}標記的文件的列表。這符合預期,但是當我遵循〜/ Tags/{tag}時,它會將導航欄中的Html.ActionLink()更改爲〜/ Tags/{tag}鏈接,而不是僅指向〜 /標籤。我不理解爲什麼當我遵循〜/ Tags/{tag}時,導航欄中的ActionLink()正在改變。如果我導航到項目中的其他鏈接,則ActionLink()將按預期工作。

我有這樣設置的actionlink和route。我的TagsController具有此索引操作。整數?用於尋呼控制。我有兩個視圖,一個叫All,一個叫Details。我究竟做錯了什麼?

 Html.ActionLink("Tags", "Index", "Tags") // In navigation bar 

     routes.MapRoute(
      "Tags", 
      "Tags/{tag}", 
      new 
      { 
       controller = "Tags", action = "Index", tag = "", 
      }); 

     public ActionResult Index(string tag, int? id) 
     { // short pseudocode 
      If (tag == "") 
      return View("All", model) 
      else 
      return View("Details", model) 
     } 

回答

4

我認爲你需要處理yoursite.com/Tags/的實例,因爲你只處理一個與標籤

我將創造另一條路線:

routes.MapRoute(
    "TagsIndex", //Called something different to prevent a conflict with your other route 
    "Tags/", 
    new { controller = "Tags", action = "Index" } 
); 

routes.MapRoute(
    "Tags", 
    "Tags/{tag}", 
    new { controller = "Tags", action = "Tag", tag = "" } 
); 


/* In your controller */ 
public ActionResult Index() // You could add in the id, if you're doing paging here 
{ 
    return View("All", model); 
} 

public ActionResult Tag(string tag, int? id) 
{ 
    if (string.IsNullOrEmpty(tag)) 
    { 
    return RedirectToAction("Index"); 
    } 

    return View("Details", model); 
} 
+0

工作就像一個魅力。你的回答給了我一個路由選擇的時刻。謝謝! – 2009-01-05 22:36:15

+0

太棒了!很高興我能幫上忙! – 2009-01-06 09:13:14

0

我建議你看看Lamda表達式來處理這個問題,你最終可能會在未來以'標籤湯'結束。

此外,請確保您已經下載了Microsoft.Web.Mvc dll,與System.Web.Mvc不同。

Where to get Microsoft.Web.Mvc.dll

2

除了創建丹·阿特金森提到了一個額外的途徑,你也應該擺脫控制器中的if語句和創建另一個控制器的方法(稱爲詳細內容)來處理標籤的細節。如果控制器中的語句確定顯示哪個視圖是代碼異味。讓路由引擎完成它的工作,你的控制器代碼將會更簡單,更容易維護。