CategoryName がオプションで、LocationName が必須フィールドの場合、Satpal の提案は機能します。両方のフィールドがオプションの場合、機能しません。ルーティングでは、どのプロパティが提供されているかを判断できないためです。このような場合、2 つのオプションがあります。1 つのオプションは、パラメーターと IRouteConstraints のさまざまな組み合わせに対して 3 つの異なるルートを定義することです。
routes.MapRoute(name: "CategoryDetail",
url: "/{controller}/{CategoryDetail}/{LocationName}",
defaults: new { controller = "User", action = "Login" },
constraints: {LocationName=@"^\d+$"}
);
routes.MapRoute(name: "CategoryDetail",
url: "/{controller}/{CategoryDetail}/{CategoryName}",
defaults: new { controller = "User", action = "Login" },
constraints: {CategoryName= new GuidConstraint() }
);
routes.MapRoute(name: "CategoryDetail",
url: "/{controller}/{CategoryDetail}/{LocationName}/{CategoryName}",
defaults: new { controller = "User", action = "Login", CategoryName = UrlParameter.Optional }
);
GuidConstraint については、こちらをご覧ください。