【问题标题】:ASP.Net MVC Html.ActionLink() problemsASP.Net MVC Html.ActionLink() 问题
【发布时间】:2009-01-05 06:26:43
【问题描述】:

我正在使用 MVC beta 编写一个简单的应用程序来理解 ASP.Net MVC。该应用程序是一个带有标签的简单照片/视频共享站点。我正在处理 MVC 骨架项目。我在导航栏中添加了一些 Html.ActionLink(),但是我在一个地方添加的 Html.ActionLink() 之一出现问题。

我希望 ~/Tags 显示数据库中的所有标签,并且我希望 ~/Tags/{tag} 显示所有带有 {tag} 标记的文件的列表。这按预期工作,但是当我关注 ~/Tags/{tag} 时,它会将导航栏中的 Html.ActionLink() 更改为与 ~/Tags/{tag} 链接相同,而不仅仅是指向 ~ /标签。我不明白为什么当我跟随 ~/Tags/{tag} 时导航栏中的 ActionLink() 会发生变化。如果我导航到项目中的其他链接,ActionLink() 将按预期工作。

我已经像这样设置了 actionlink 和 route。我的 TagsController 有这个 Index 动作。整数?用于分页控制。我有两个视图,一个称为全部,一个称为详细信息。我做错了什么?

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

【问题讨论】:

    标签: asp.net-mvc routing


    【解决方案1】:

    我认为您需要处理 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);
    }
    

    【讨论】:

    • 工作就像一个魅力。你的回答给了我一个很好的路由时刻。谢谢!
    【解决方案2】:

    除了像 Dan Atkinson 提到的那样创建额外的路由之外,您还应该摆脱控制器中的 if 语句,并创建另一个控制器方法(称为 Details)来处理标签详细信息。控制器中用于确定要显示哪个视图的 if 语句是代码异味。让路由引擎完成它的工作,你的控制器代码会更简单,更容易维护。

    【讨论】:

    • if 语句感觉不对,但修复路由摆脱了 if。
    【解决方案3】:

    我建议你研究一下 Lamda 表达式来处理这个问题,你将来可能会得到一个“标签汤”。

    另外,请确保您已下载 Microsoft.Web.Mvc dll,不同于 System.Web.Mvc。

    Where to get Microsoft.Web.Mvc.dll

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 2010-10-22
      • 2011-10-27
      相关资源
      最近更新 更多