경로의 여러 문자가 "특별"되어 - 및 /와 같은 매개 변수가 분리됩니다. 경로에있는 여분의 파일이 실패 할 수 있습니다. 시도해보십시오 "{id}-{*title}"
이 제목에 뒤 따르는 모든 것을 포함하게 만듭니다.
업데이트
대답은 위의 충분한 커피를 했어 전에에 유래 갈 때 일어나는 것입니다.
사용자가 업로드 한 파일의 파일 이름을 처리 할 때와 동일한 문제가 발생했으며 경로에 '-'가 구분 기호로 포함되어 있지만 이후 매개 변수의 값으로도 사용될 수 있지만 올바른 URL을 생성 할 수는 있지만 wouldn 그것과 일치하지 마라. 결국이 문제를 처리하고이 경로를 등록하기 위해 SpecialFileRoute 클래스를 작성했습니다. 조금 추한 일이지만 그 일을합니다.
URL을 생성하기 위해 이전 스타일의 MVC 경로를 유지했음을 유의하십시오.이 작업을 올바르게 수행하기 위해 노력하고 있었지만 나중에 다시 돌아올 내용입니다.
이 위에서 언급 한 바와 같이
context.Routes.Add(new SpecialFileRoute(AreaName) { Controller = "Doc", Action = "Download" });
조금 못생긴 내가 많은 일이있어 시간이있을 때 내가이 문제를 개선 할 좋아하지만 것 다음과 같이
/// <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"]));
}
}
경로가 추가됩니다 필요한 매개 변수로 URL을 분할하는 문제를 해결했습니다. URL 패턴이있는이 한 경로의 특정 요구 사항에 매우 강하게 묶여 있습니다. Regex 및 Values는 코드화되어 있지만 시작에 도움이됩니다.
마지막으로 우리는 제목과 ID를 구분하지 않을 것입니다. 왜 아직도 작동하지 않는지 궁금하지만 더 이상 차단하지 않습니다. 당신의 도움을 주셔서 감사합니다! –