2013-04-08 49 views
0

我想知道如何保持一个在ASP.NET MVC-4UrlRedirect奇怪的重定向行为

例如,我有这样的:

/admin/category/add/81/142 

但我使用后:

return RedirectToAction("Add", "Category", new RouteValueDictionary 
{ 
    {"id", siteid.Value}, 
    {"cid", pid.HasValue ? pid.Value : cid.Value } 
}); 

我得到这个:

/admin/category/add?id=81&cid=142 

但我想原来的/admin/category/add/81/142

这里是我的路由配置:

public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRouteLowercase(
      "Admin_LogOn", 
      "Admin/{controller}/{action}/", 
      defaults: new { controller = "Account", action = "LogOn" }, 
      constraints: null 
     ); 

     context.MapRouteLowercase(
      "Admin_Category_List_Add", 
      "Admin/{controller}/{action}/{id}/{cid}/{pid}", 
      defaults: 
       new 
       { 
        controller = "Category", 
        action = "Create", 
        id = UrlParameter.Optional, 
        cid = UrlParameter.Optional, 
        pid = UrlParameter.Optional 
       }, 
      constraints: null 
     ); 


     context.MapRouteLowercase(
      "Admin_TwoParameters", 
      "Admin/{controller}/{action}/{id}/{cid}", 
      defaults: new { controller = "Manager", action = "Index", id = UrlParameter.Optional, cid = UrlParameter.Optional }, 
      constraints: null 
    ); 


     context.MapRouteLowercase(
      "Admin_default", 
      "Admin/{controller}/{action}/{id}", 
      defaults: new { controller = "Manager", action = "Index", id = UrlParameter.Optional }, 
      constraints: null 
     ); 
    } 

回答

1
But i want the original one /admin/category/add/81/142 

要保留格式,你可以这样做:

return Redirect(Url.Action("Add", "Category") + "/" + siteid.Value + "/" + (pid.HasValue ? pid.Value : cid.Value)); 

,或者如果你喜欢Concat的字符串(我更喜欢第一个):

return Redirect(new[] { Url.Action("Add", "Category"), "/", siteid.Value, "/", (pid.HasValue ? pid.Value : cid.Value).ToString()}); 
+0

请告诉我,我可以做更多的一般行为,喜欢实现自定义路由还是什么? – IamStalker 2013-04-08 09:42:26

+0

不使用自定义路由,您可以使用它将您想要的url格式映射到正确的控制器和方法。 Url.Action已经是一种“普遍行为”,并且已经将'routevalues'传递给它。只有它真的会给你的键值对(例如ID = 81)。但是,与我的建议解决方案相比,这是最安全的 - 对于您的问题,这是一个相当好的答案。另一种方法 - 除了Url.Action提供的内容之外,您可以将(动态)对象传递给将为您构建字符串的方法。 – 2013-04-08 09:55:33

+0

感谢您的建议,您的解决方案很好地工作。 – IamStalker 2013-04-08 12:03:31