MVC 3默认操作没有使用MapRoute?

时间:2012-03-09 08:57:22

标签: c# asp.net-mvc-3

我的要求是能够映射自定义控制器,但内置它只能调用一个操作。所以不要这样:

 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参数中指定声明它。

任何帮助?

1 个答案:

答案 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 }
);