我正在使用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”?
答案 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"
正在搞乱事情
希望有所帮助,
丹