【发布时间】:2012-03-19 19:15:33
【问题描述】:
我正在构建一个简单的报表 Web 应用程序,用于使用 ASP.NET MVC3 + WebForms 呈现报表。报告本身由 ReportViewer ASP.NET WebForms 控件呈现,但我想使用 ASP.NET MVC 创建参数条目。
我希望所有请求都遵循默认路由方案“~/{controller}/{action}/{parameters}”,但对~/Report 的请求除外,它应该转到呈现WebForm 的报告。这样做的正确方法是什么?
扩大一点..
我在Global.asax.cs 中有两条路线 - 默认一条和一条用于 WebForms 页面。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
routes.MapPageRoute("report-rendering", "Report", "~/Render.aspx");
}
URL 渲染得很好,但问题是当请求进来时,第一个路由也吃掉第二个路由的 URL,即~/Report?id=7 尝试调用 Index 上的 @987654327 方法@(不存在)。
如果我将其更改为“report-rendering”路由位于“Default”路由之前,如下所示:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapPageRoute("report-rendering", "Report", "~/Render.aspx");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
现在对 Html.ActionLink() 的调用会呈现不正确的 URL,即
`@Html.ActionLink("Report list", "Index", "ReportList")`
渲染
`http://localhost:49910/Report?action=Index&controller=ReportList`
我当前的解决方法首先将“默认”路由放在首位,同时添加一个正则表达式约束以忽略对“报告”控制器的请求,如下所示:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { controller = @"(?!report$).*" }
);
这感觉不干净。同样,这样做的正确方法是什么?
另外,我还没有决定如何将参数传递给渲染表单:我可以使用两个查询参数或 POST 它们。我猜查询参数更灵活。这里的最佳做法是什么?
编辑:
在研究@LeftyX 的答案时,我似乎找到了答案。引用 P. Haack 在Professional ASP.NET MVC 3 中的路由章节(命名路由,第 9 章,第 233 页):
... 为您的所有路线使用名称和 生成 URL 时始终使用路由名称。大多数时候,让 Routing 排序 您想用来生成 URL 的路由实际上是靠运气,这不是 与强迫症控制狂开发者相处得很好。生成 URL 时,通常 确切地知道您要链接到哪个路由,因此您不妨按名称指定它。
上述部分讨论了与我描述的情况非常相似的情况。
但是由于Html.ActionLink() 没有路由名称参数的重载,这是否意味着如果有这样的路由,我不能在整个应用程序的任何地方可靠地使用它?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-routing