2009-01-05 82 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语句和创建另一个控制器的方法(称为详细内容)来处理标签的细节。如果控制器中的语句确定显示哪个视图是代码异味。让路由引擎完成它的工作,你的控制器代码将会更简单,更容易维护。