我的要求是能够映射自定义控制器,但内置它只能调用一个操作。所以不要这样:
context.MapRoute(
"RouteName",
"{controller}/{id}",
new {
controller = "MyCustomController",
action = "DefaultAction", <- I want to remove this.
id = UrlParameter.Optional
}
);
我想这样做:
context.MapRoute(
"RouteName",
"{controller}/{id}",
new {
controller = "MyCustomController",
id = UrlParameter.Optional
}
);
让它通过“默认调用”调用“默认调用”...默认情况下,无需在MapRoute的defaults参数中指定声明它。
任何帮助?
答案 0 :(得分:3)
你做不到。您的网址不包含{action}
令牌。这意味着您绝对应该在默认值中指定要调用的操作。
把自己放在路由引擎的位置。您会看到以下请求:Home/123
。您查看路径定义,然后看到{controller}/{id}
。
很棒=&gt;现在您知道可以实例化HomeController
但是如果没有将操作指定为默认值,那就是您所知道的。你不知道在HomeController
上调用哪个动作,故事就在这里结束。
您向开发人员抛出以下异常,以告知他代码的问题:
RouteData必须包含名为“action”的项目,其中包含非空字符串值。
更新:
您可以编写一个自定义扩展方法,允许您省略声明中的默认操作,但它会在后台添加它:
public static class RouteExtensions
{
public static Route MyMapRoute(this RouteCollection routes, string name, string url, object defaults)
{
var defaultValues = new RouteValueDictionary(defaults);
if (!defaultValues.ContainsKey("action"))
{
defaultValues["action"] = "index";
}
var route = new Route(url, new MvcRouteHandler())
{
Defaults = defaultValues,
Constraints = new RouteValueDictionary(),
DataTokens = new RouteValueDictionary()
};
routes.Add(name, route);
return route;
}
}
然后:
routes.MyMapRoute(
"RouteName",
"{controller}/{id}",
new { controller = "MyCustomController", id = UrlParameter.Optional }
);