ルート内のいくつかの文字は「特別」で、 - や/などのパラメータを分割します。ルート内の余分なものが原因で障害が発生している可能性があります。試しに"{id}-{*title}"
を試してください。
更新
上記の答えは、あなたが十分なコーヒーを持っていた前に、あなたはStackOverflowの上で行くときに何が起こるかです。
ユーザーがアップロードしたファイルのファイル名を扱う同じ問題が発生しました。このルートには区切り文字として ' - 'が含まれていますが、後のパラメータの値でも使用できますそれに合っていない。最後に、この問題を処理するための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パターン、Regex、Valuesは、あなたが始めるべきであるが、コード化されたこの1つのルートの特定の要件に非常に強く結びついています。
最後に、IDとタイトルの間の区別を区別しないでください。私はまだこれがなぜ機能していないのだろうと思っていますが、もはやブロックしません。ご協力いただきありがとうございます! –