ASP.net MVC区域并创建一个带ID的ActionLink(SEO /干净URL)

时间:2009-08-14 19:48:45

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

我正在使用ASP.NET MVC 1.0 / C#为客户构建一个Help Desk Ticket系统。我已经实施了Steven Sanderson的“App Areas in ASP.NET MVC, Take 2”并且它运作良好。

在我的Globabl.asax页面中,我有一些定义如下的路线:

public static void RegisterRoutes(RouteCollection routes)
{
    // Routing config for the HelpDesk area
    routes.CreateArea("HelpDesk", "ProjectName.Areas.HelpDesk.Controllers",
        routes.MapRoute(null, "HelpDesk/{controller}/{action}", new { controller = "Ticket", action = "Index" }),
        routes.MapRoute(null, "HelpDesk/Ticket/Details/{TicketId}", new { controller = "Ticket", action = "Details", TicketId = "TicketId" })
    );
}

因此,如果我手动在浏览器地址栏中输入“http://localhost/HelpDesk/Ticket/Details/12”,我会得到我期望的结果。这是我的控制器:

public ActionResult Details(int TicketId)
{
    hd_Ticket ticket = ticketRepository.GetTicket(TicketId);
    if (ticket == null)
        return View("NotFound");
    else
        return View(ticket);
}

在我看来,我有:

<%= Html.ActionLink(item.Subject, "Details", new { item.TicketId } )%>

但该代码会生成“http://localhost/HelpDesk/Ticket/Details?TicketId=12”,它也会返回预期的结果。我的问题是......

如何在使用Steven Sanderson Areas创建干净的网址时定义ActionLink,如:“http://localhost/HelpDesk/Ticket/Details/12”?

3 个答案:

答案 0 :(得分:4)

尝试

<%= Html.ActionLink(item.Subject, "Details", new { TicketId = item.TicketId } )%>

ActionLink方法需要一个包含与参数名称匹配的键的字典。 (请注意,传递匿名对象是一种方便)。我认为还有其他任何东西只会标记在URL的末尾。

编辑:这对你不起作用的原因是你的第一条路线匹配并优先(控制器和动作),但没有定义TicketId参数。您需要切换路线的顺序。您应该始终将最具体的路线放在首位。

答案 1 :(得分:1)

尝试

<%= Html.ActionLink(item.Subject, "Details", new { TicketId=item.TicketId } )%>

答案 2 :(得分:1)

我认为Womp有它......

哦,当你交换路线时,试试

routes.MapRoute(null, "HelpDesk/Ticket/Details/{TicketId}", new { controller = "Ticket", action = "Details"})

我认为,TicketId = "id"正在搞乱事情

希望有所帮助,