Я пытаюсь реализовать URL Redirect
для перенаправления всего запроса на URL-адрес, например. как www.myweb.com/201
к www.myweb.com/201/my-blog-title
:Формат данного пути не поддерживается при маршрутизации в MVC
код у меня есть, как это:
In controller:
public ActionResult Post(int pId){
...
string urlPostTitle = "";
if (postInfo[1].Length > 50)
urlPostTitle = postInfo[1].Substring(0, 75);
else
urlPostTitle = postInfo[1];
urlPostTitle = urlPostTitle.Replace(' ', '-');
return RedirectPermanent(Url.Action("PostRedirect", new { pId = pId, postTitle = urlPostTitle }));
}
public ActionResult PostRedirect(int pId, string postTitle)
{
var postInfo = TempData["PostInfo"];
if (postInfo != null)
return View("Post");
else
//return RedirectToAction("Post", new { pId = pId });
return RedirectToActionPermanent("Post", new { pId = pId });
}
В RouteConfig
:
routes.MapRoute("GetPost", "{pId}", new { controller = "Blog", action = "Post", }, new { pId = @"^\d{1,3}$" });
routes.MapRoute(name: "GetPostRedirect", url: "{pId}/{postTitle}", defaults: new { controller = "Blog", action = "PostRedirect", postTitle = UrlParameter.Optional, reDirect = UrlParameter.Optional }, constraints: new { pId = @"^\d{1,3}$" });
Сейчас этот подход работает иногда, а иногда оленья кожа usuallu первый раз он хорошо работает во второй раз, браузер дает такую ошибку:
This web page has a redirect loop
Когда-нибудь, если я снова освежусь, он снова будет работать нормально .. Иногда это не так. И это одна locahost.
На сервере всякий раз, когда я развернуть эту технику и попытаться получить доступ к странице, это дает мне это:
The given path's format is not supported.
[NotSupportedException: The given path's format is not supported.]
System.Security.Util.StringExpressionSet.CanonicalizePath(String path, Boolean needFullPath) +10655581
System.Security.Util.StringExpressionSet.CreateListFromExpressions(String[] str, Boolean needFullPath) +293
System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess access, AccessControlActions control, String[] pathListOrig, Boolean checkForDuplicates, Boolean needFullPath, Boolean copyPathList) +109
System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess access, String path) +63
System.Web.InternalSecurityPermissions.PathDiscovery(String path) +29
System.Web.HttpRequest.get_PhysicalPath() +40
WebsitePanel.IIsModules.SecureFolders.context_OnEnter(Object sender, EventArgs e) +67
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69
Может кто-нибудь, пожалуйста, объясните это случайное поведение для меня?
выше решение работает хорошо, когда URL, как 'website.com/12', что только ID в нем, но и для URL, который имеет как идентификатор и title, например 'website.com/12/my-title', он непосредственно подбирает маршрут к методу' Post', поскольку он соответствует аргументу. Есть ли способ, которым я могу сделать маршрут «Post» только удаленным от insdie, и все оба URL-запроса с идентификатором и идентификатором и заголовком должны сначала перейти к методу PostUrlDetermine. – Maven