2009-08-14 89 views
1

我正在为使用ASP.NET MVC 1.0/C#的客户端构建一个帮助台票务系统。我已经实施了史蒂文桑德森的“App Areas in ASP.NET MVC, Take 2”,它工作得很好。手动ASP.net MVC区域和创建一个带ID(SEO /干净URL)的ActionLink

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”,我得到我预期的结果:

在我Globabl.asax页我定义为这样一些途径。这里是我的控制器:

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,它将创建一个干净的URL,如“http://localhost/HelpDesk/Ticket/Details/12”?

回答

4

尝试

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

的ActionLink的方法需要相匹配的参数名称是键的字典。 (请注意,传递一个匿名对象对此很方便)。其他任何我相信它只会标记到URL的末尾。

编辑:,这是不是为你工作的原因是因为你的第一个路由匹配,并优先(控制器和动作),但没有定义TicketId参数。您需要切换路线的顺序。你应该总是先把你最具体的路线。

+0

Womp ...有它!你是对的。这是命令! – robnardo 2009-08-17 12:48:21

1

尝试

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

我认为Womp有它...

哦,当你在你的交换路由尝试

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

我认为,TicketId = "id"是搞乱东西

希望帮助,

+0

感谢丹,那也工作得很好 – robnardo 2009-08-17 12:48:59