路由中的几个字符是“特殊的”,会拆分-和/等参数。可能是路由中额外的 -s 导致它失败。试试"{id}-{*title}",因为这会使标题包含以下所有内容。
更新
上面的答案是在你喝够咖啡之前打开 StackOverflow 会发生什么。
我们在处理用户上传的文件的文件名时遇到了同样的问题,路由包含“-”作为分隔符,但也可以在后面的参数中使用,它可以生成正确的 URL,但不会匹配它。最后我写了一个 SpecialFileRoute 类来处理这个问题并注册了这个路由。虽然有点难看,但确实可以。
请注意,我保留了用于生成 URL 的旧式 MVC 路由,我一直在尝试让它正确地完成它,但它稍后会回来。
/// <summary>
/// Special route to handle hyphens in the filename, a catchall parameter in the commented route caused exceptions
/// </summary>
public class SpecialFileRoute : RouteBase, IRouteWithArea
{
public string Controller { get; set; }
public string Action { get; set; }
public IRouteHandler RouteHandler = new MvcRouteHandler();
public string Area { get; private set; }
//Doc/{doccode} - {CatNumber}.{version} - {*filename},
public SpecialFileRoute(string area)
{
Area = area;
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
string url = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2);
var urlmatch = Regex.Match(url, @"doc/(\w*) - (\d*).(\d*) - (.*)", RegexOptions.IgnoreCase);
if (urlmatch.Success)
{
var routeData = new RouteData(this, this.RouteHandler);
routeData.Values.Add("doccode", urlmatch.Groups[1].Value);
routeData.Values.Add("CatNumber", urlmatch.Groups[2].Value);
routeData.Values.Add("version", urlmatch.Groups[3].Value);
routeData.Values.Add("filename", urlmatch.Groups[4].Value);
routeData.Values.Add("controller", this.Controller);
routeData.Values.Add("action", this.Action);
return routeData;
}
else
return null;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
if (values.ContainsKey("controller") && (!string.Equals(Controller, values["controller"] as string, StringComparison.InvariantCultureIgnoreCase)))
return null;
if (values.ContainsKey("action") && (!string.Equals(Action, values["action"] as string, StringComparison.InvariantCultureIgnoreCase)))
return null;
if ((!values.ContainsKey("contentUrl")) || (!values.ContainsKey("format")))
return null;
return new VirtualPathData(this, string.Format("{0}.{1}", values["contentUrl"], values["format"]));
}
}
路由添加如下:
context.Routes.Add(new SpecialFileRoute(AreaName) { Controller = "Doc", Action = "Download" });
如上所述,这有点难看,当我有时间时,我想做很多工作来改进它,但它解决了将 URL 拆分为所需参数的问题。虽然它应该给你一个开始,但它与这一条路线的具体要求密切相关,url 模式、正则表达式和值是硬编码的。