2014-02-20 1 views
0

Я пытаюсь реализовать 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 

Может кто-нибудь, пожалуйста, объясните это случайное поведение для меня?

ответ

0

В PostRedirect действие вы создаете цикл. Если я понял вас правильно, предпримите одно действие, которое определит, какое действие будет срабатывать. Сначала вызовите это действие.

public ActionResult PostUrlDetermine(int? pId) 
{ 
    //your logic here 

    // if there is any post, generate title, and redirect that post 
    return RedirectToAction("Post", new { pId = pId, postTitle = urlPostTitle }); 

    //else, if there is not such post, redirect not found page. 
    // .... 

    //or, redirect post page without title, only with id. 
    return RedirectToAction("Post", new { pId = pId }); 
} 

И Сообщение действие:

public ActionResult Post(int pId, string postTitle) 
{ 
    //post view page 
} 
+0

выше решение работает хорошо, когда URL, как 'website.com/12', что только ID в нем, но и для URL, который имеет как идентификатор и title, например 'website.com/12/my-title', он непосредственно подбирает маршрут к методу' Post', поскольку он соответствует аргументу. Есть ли способ, которым я могу сделать маршрут «Post» только удаленным от insdie, и все оба URL-запроса с идентификатором и идентификатором и заголовком должны сначала перейти к методу PostUrlDetermine. – Maven

Смежные вопросы