【问题标题】:ASP.NET MVC 3 routing in /Admin area with name instead of id/Admin 区域中的 ASP.NET MVC 3 路由,使用名称而不是 id
【发布时间】:2011-09-05 03:43:04
【问题描述】:

这个人一直在扔我,所以我想我会寻求帮助。我已经让它与我的“类别”路线一起使用,但由于某种原因,当我试图对“消费者”做同样的事情时,它根本不起作用。以下是必要的背景信息:

路由(AdminAreaRegistration.cs):

public override void RegisterArea(AreaRegistrationContext context)
    {
        //matches /Admin/BusinessCategories/MyCategory/children
        context.MapRoute(
            "ChildCategories",
            "Admin/BusinessCategories/{category}/children",
            new { controller = "BusinessCategories", action = "ViewChildren" }
        );

        //matches /Admin/BusinessCategories/MyCategory/edit
        context.MapRoute(
            "EditCategory",
            "Admin/BusinessCategories/{category}/edit",
            new { controller = "BusinessCategories", action = "Edit" }
        );

        // want this to match /Admin/Consumers/JoeBob/details
        context.MapRoute(
            "ConsumerDetails",
            "Admin/Consumers/{alias}/details",
            new { controller = "Consumers", action = "Details" }
        );

        //matches /Admin
        //matches /Admin/BusinessCategories
        //matches /Admin/BusinessCategories/New

        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { controller = "AdminHome", action = "Index", id = UrlParameter.Optional },
            new { id = @"\d+" }
        );
    }

然后在我的消费者控制器(ConsumersController.cs)中:

public class ConsumersController : Controller
{

    public ActionResult Index()
    {
        ...code...
    }

    [HttpGet]
    public ActionResult Details(string alias)
    {
        return View(alias);
    }
}

然后我像这样生成我的链接:

@Html.ActionLink(c.Alias, "Details", "Consumers", new { alias = c.Alias }, null)

问题是我对@Html.ActionLink 的调用正在生成如下链接:

/Admin/Consumers/details?alias=JoeBob(如果单击,则会导致 404) 而不是我想要的,那就是:

/Admin/Consumers/JoeBob/details

我注意到的一件事是,如果我将 alias = c.Alias 更改为 id = c.Alias,它会生成如下 URL: /Admin/Consumers/details/JoeBob(因此它从查询字符串中删除了别名部分,但仍将“详细信息”放在别名之前。)

有什么想法吗?

编辑:重新启动 IIS 为我解决了这个问题。不知道为什么,但确实如此。

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing asp.net-mvc-areas


【解决方案1】:

您的路线配置正确(我对其进行了测试)。我怀疑您遇到了这种不当行为,因为包含您的 @Html.ActionLink() 标记的视图位于您的管理区域之外。如果它在您的管理区域内,您应该会看到生成的正确链接。但是,在您的管理区域之外,您需要像这样声明您要定位的区域:

@Html.ActionLink(c.Alias, "Details", "Consumers", new { alias = c.Alias, area = "Admin" }, null)

【讨论】:

  • 实际上,@Html.ActionLink 调用 is 在我的管理区域内。奇怪的是,我进入服务器并重新启动 IIS,现在正在生成正确的 URL 结构,但现在 MVC 正在尝试查找具有消费者名称的视图,而不是“详细信息”视图 - 即使我在路由中指定了 Controller 和 Action 名称。 :-\
  • 没关系 - 想通了那部分。我将别名传递给 View 函数(在其中留下了一些测试代码),所以它就像 return View(alias)。我删除了“别名”部分,所以它只是返回 View(),一切都很好。
  • 这很奇怪。我在一个全新的 MVC3 项目中测试了你的代码,它对我有用,所以我认为你的代码没有任何问题。祝你好运解决这个问题。
  • 是的,我不完全确定问题是什么,也不知道为什么通过在服务器上重新启动 IIS 来“解决”它,但这似乎可以解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 2011-07-03
  • 1970-01-01
  • 2021-02-13
  • 2011-04-06
  • 2011-11-15
  • 1970-01-01
相关资源
最近更新 更多