2012-06-23 2 views
1

Я пытаюсь следовать этой страницы http://www.deliveron.com/blog/post/SEO-Friendly-Routes-with-ASPnet-MVC.aspx и это то, что я имею в global.asax,ASP.NET MVC SEO дружественных URL

public class MvcApplication : System.Web.HttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.MapRoute(
      "MemberRoute",      // routeName 
      "member/{userId}/{pseudoName}", // url 
      new 
      {       // url defaults 
       controller = "Member", 
       action = "Index", 
       userId = 0, 
       pseudoName = UrlParameter.Optional 
      }, 
      new 
      {       // url constraints 
       userId = @"\d+" // must match url {userId} 
      } 
     ); 
    } 

    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
    } 
} 

MemberController,

public ActionResult Index(int id, string pseudoName) 
    { 
     User user; 
     var unitOfWork = new UnitOfWork(); 
     user = unitOfWork.UserRepository.GetById(id); 

     var expectedName = user.PseudoName.ToSeoUrl(); 
     var actualName = (pseudoName ?? "").ToLower(); 

     // permanently redirect to the correct URL 
     if (expectedName != actualName) 
      return RedirectToActionPermanent("Index", "Member", new { id = user.UserId, pseudoName = expectedName }); 
     return View(user); 
    } 

Это возвращается из Войти действие от AccountController,

return RedirectToAction("Index", "Member", new { id = user.UserId, pseudoName = user.PseudoName }); 

Когда редирект происходит, URL-адрес становится похожим http://site.com/Member/1?pseudoName=CEO

Что я делаю неправильно?

+0

'RedirectToRoute ("член", новый {идентификатор = user.UserId, pseudoName = user.PseudoName})'. Посмотрите 'RedirectToRoute'. –

+0

Я получаю сообщение об ошибке «Маршрут с именем« Member »не найден в коллекции маршрутов. Имя параметра: name« –

ответ

0

Имейте в виду, что вы используете MapRoute над MapHttpRoute, так что вы хотите, чтобы вызвать его, используя RedirectToRoute или (в разметке) @Html.RouteLink.

Таким образом, чтобы заставить его работать в вашем коде выше, вместо того, чтобы перенаправлять к действию, а затем указать параметры, используйте следующее:

return RedirectToRoute("Member", new { 
    userId = user.Id, // note i use userId as it's in the route's url 
    pseudoName = user.pseudoName 
}); 

Кроме того, исправление в вашем маршруте будет идти следующим образом:

routes.MapRoute(
    "Member",      // routeName 
    "member/{userId}/{pseudoName}", // url 
    new {       // url defaults 
    controller = "Member", 
    action = "Index", 
    userId = 0, 
    pseudoName = UrlParameter.Optional 
    }, 
    new {       // url constraints 
    userId = @"\d+"    // must match url {userId} 
    } 
); 
+0

Скопировано это точно, и я до сих пор получаю сообщение об ошибке ... Не удалось найти маршрут с именем «Member» в сборке маршрутов. Имя параметра: name –

+0

Где у вас есть ссылка на '{name}'? Может быть, еще один маршрут с '{name}' в его url? –

+0

У меня нет других определённых маршрутов. –