如何使用ASP.NET MVC制作各种通配符路径

时间:2015-02-16 19:42:29

标签: asp.net-mvc asp.net-mvc-routing

我想将所有看起来像mydomain.com/ng*的电话映射到我的Ng控制器索引。我没有得到如何添加MapRoute。我已经尝试了以下内容,但这给了我一个立即错误路由参数名称''无效。

        // ng*
        routes.MapRoute("NgWildcard", "Ng{*}",
            new
            {
                /* Your default route */
                controller = "Ng",
                action = "Index"
            });

2 个答案:

答案 0 :(得分:1)

来自MSDN

  

URL模式由HTTP请求中应用程序名称之后的段组成。例如,在网址http://www.contoso.com/products/show/beverages中,该模式适用于产品/展示/饮料。具有三个细分的模式(例如{controller} / {action} / {id})与网址http://www.contoso.com/products/show/beverages匹配。每个段由/字符分隔。当段用大括号({和})括起时,该段将被引用为URL参数。 ASP.NET路由从请求中检索值并将其分配给URL参数。在上一个示例中,URL参数操作被赋值为show。 如果细分未包含在大括号中,则会将该值视为文字值。

来自MSDN

  

您可以在分隔符之间定义多个占位符,但必须用常量值分隔。例如,{language} - {country} / {action}是有效的路由模式。但是,{language} {country} / {action}不是有效模式,因为占位符之间没有常量或分隔符。因此,路由无法确定将语言占位符的值与国家/地区占位符的值分开的位置。

换句话说," Ng {*}"被视为URL中的文字值,因为您既没有将整个段括在大括号中,也没有定义2个占位符,中间有一个分隔符。要将其视为占位符,您必须在Ng{*}之间放置一个有效的分隔符。正如Daniel所说,你还应该命名通配符占位符,以便在路径中引用它。

routes.MapRoute("NgWildcard", "Ng-{*ngName}",
    new
    {
        /* Your default route */
        controller = "Ng",
        action = "Index"
    });

如果您希望您的路线完全符合您的要求,则需要继承RouteBase。

public class NgRoute : RouteBase
{
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        RouteData result = null;
        var path = httpContext.Request.Path;
        if (path.StartsWith("Ng"))
        {
            // Process your route
            result.Values["controller"] = "Ng";
            result.Values["action"] = "Index";
            // Process additional URL segments and set route values accordingly
        }

        // Always return null in case of a non-match.
        return result;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        VirtualPathData result = null;

        var controller = Convert.ToString(values["controller"]);
        var action = Convert.ToString(values["action"]);

        if (controller == "Ng" && action == "Index")
        {
            // Return the virtual path to your URL (not sure how you will do that)
            var virtualPath = "Ng"; // TODO: Finish path
            return new VirtualPathData(this, virtualPath);
        }

        // Always return null in case of a non-match.
        return result;
    }
}

正如其他人已经说过的那样,只要在使用通配符时解析URL中的其他段,您就可以独立完成。

答案 1 :(得分:0)

尝试命名

routes.MapRoute("NgWildcard", "Ng{*ngName}",
        new
        {
            /* Your default route */
            controller = "Ng",
            action = "Index"
        });