2013-04-08 4 views
0

Я хотел бы знать, как сохранить UrlRedirect в ASP.NET MVC-4:Странно редирект поведение

К примеру у меня есть это:

/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

+0

Не с пользовательской маршрутизацией вы используете его для сопоставления формата URL-адреса, который вы хотите, с соответствующими контроллерами и методами. 'Url.Action' уже является« общим поведением », а также передает ему« routevalues ​​». Только он действительно даст вам пару ключ-значение (например, id = 81). Но это самое безопасное, что вы можете пойти, по сравнению с моим предлагаемым решением - довольно хороший ответ на ваш вопрос. Альтернатива - вы можете передать (динамический) объект методу, который будет строить для вас строку, в дополнение к тому, что дает Url.Action. –

+0

Спасибо за предложение, ваше решение работало красиво. – IamStalker