我想将所有看起来像mydomain.com/ng*的电话映射到我的Ng控制器索引。我没有得到如何添加MapRoute。我已经尝试了以下内容,但这给了我一个立即错误路由参数名称''无效。
// ng*
routes.MapRoute("NgWildcard", "Ng{*}",
new
{
/* Your default route */
controller = "Ng",
action = "Index"
});
答案 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"
});