如果您不介意在您要为其生成 URL 的控制器中的每个操作旁边添加一个方法,您可以按照以下步骤进行操作。与您的 lambda 表达式方法相比,这有一些缺点,但也有一些优点。
执行:-
将此添加到您的控制器中,以获取您想要为其生成强类型 url 的每个操作方法...
// This const is only needed if the route isn't already mapped
// by some more general purpose route (e.g. {controller}/{action}/{message}
public const string SomeMethodUrl = "/Home/SomeMethod/{message}";
// This method generates route values that match the SomeMethod method signature
// You can add default values here too
public static object SomeMethodRouteValues(MessageObject messageObject)
{
return new { controller = "Home", action = "SomeMethod",
message = messageObject };
}
您可以在路线映射代码中使用这些...
Routes.MapRoute ("SomeMethod",
HomeController.SomeMethodUrl,
HomeController.SomeMethodRouteValues(null));
而且您可以在需要生成该操作的链接的任何地方使用它们:-例如
<%=Url.RouteUrl(HomeController.SomeMethodValues(new MessageObject())) %>
如果你这样做...
1)您的代码中只有一个位置定义了任何操作的参数
2)只有一种方法可以将这些参数转换为路由,因为 Html.RouteLink 和 Url.RouteUrl 都可以将 HomeController.SomeMethodRouteValues(...) 作为参数。
3) 很容易为任何可选的路由值设置默认值。
4) 在不破坏任何 url 的情况下重构代码很容易。假设您需要向 SomeMethod 添加一个参数。您所做的只是更改 SomeMethodUrl 和 SomeMethodRouteValues() 以匹配新参数列表,然后修复所有损坏的引用,无论是在代码中还是在视图中。尝试使用散布在您的代码中的 new {action="SomeMethod", ...} 来执行此操作。
5) 您获得 Intellisense 支持,因此您可以查看构建任何操作的链接或 URL 所需的参数。就“强类型”而言,这种方法似乎比使用没有编译时或设计时错误检查链接生成参数有效的 lambda 表达式更好。
缺点是您仍然必须使这些方法与实际操作方法保持同步(但它们可以在代码中彼此相邻,以便于查看)。纯粹主义者无疑会反对这种方法,但实际上它是在查找和修复原本需要测试才能发现的错误,并且它有助于替换我们过去在 WebForms 项目中使用的强类型 Page 方法。