Я неправильно подхожу к маршрутам в моем приложении? - PullRequest
2 голосов
/ 22 августа 2011

Я работаю над своим первым приложением ASP.NET MVC 3, и у меня есть пара действий, определенных для обработки добавления / удаления мороженого из меню.Они выглядят так:

[HttpPost]
public PartialViewResult AddMenuIceCreamMapping(int iceCreamId, int menuId)


[HttpPost]
public PartialViewResult RemoveMenuIceCreamMapping(int iceCreamId, int menuId)

Чтобы эти действия не привели к ошибке 404, я зашел в файл Global.asax.cs и добавил следующее:

routes.MapRoute(
  "AddMenuIceCreamMapping", // Route name
  "IceCream/AddMenuIceCreamMapping/{iceCreamId}/{menuId}", // URLwith parameters
  new
  {
     controller = "IceCream",
     action = "AddMenuIceCreamMapping",
     iceCreamId = UrlParameter.Optional,
     menuId = UrlParameter.Optional
  } 
);

routes.MapRoute(
  "RemoveMenuIceCreamMapping", // Route name
  "IceCream/RemoveMenuIceCreamMapping/{iceCreamId}/{menuId}", // URLwith parameters
  new
  {
     controller = "IceCream",
     action = "RemoveMenuIceCreamMapping",
     iceCreamId = UrlParameter.Optional,
     menuId = UrlParameter.Optional
  } 
);

и это работает, то есть я могу нажать кнопку «Добавить» или «Удалить» на своей странице и добавить или удалить отображение мороженого / меню.Отлично.Но я ожидаю, что таких ситуаций будет больше, и я вижу, что этот контейнер маршрутов содержит больше записей, подобных этим.И, на мой взгляд, начинающий веб-программист кажется немного неуклюжим, и я начинаю думать, что, возможно, я поступаю неправильно.Я?Есть ли лучший способ приблизиться к этому, чтобы я не заканчивал тем, что выполнял действие "go create some action", которое принимает N параметров, а затем добавлял маршрут ".Любые предложения здесь?

Ответы [ 4 ]

1 голос
/ 23 августа 2011

Вы знаете, что вы также можете использовать параметры строки запроса даже с запросами POST? Используя только маршрут по умолчанию (который поставляется с новыми проектами ASP.NET MVC), вы можете достичь своих действий с помощью /IceCream/AddMenuIceCreamMapping/?iceCreamId=1&menuId=1 и /IceCream/RemoveMenuIceCreamMapping/?iceCreamId=1&menuId=1.

Использование параметров запроса строки также показывает, что этот URL-адрес является параметризованным вызовом метода, а не ссылкой на ресурс, как указывалось бы в исходных URL-адресах.

1 голос
/ 22 августа 2011

Вы можете использовать заполнители в ваших сопоставлениях, чтобы справиться с этим ... Вместо того, что вы получили выше, вы можете использовать это (обратите внимание, что я не указываю по умолчанию):

routes.MapRoute(
                "TwoParameterRoute", // Route name
                "{controller}/{action}/{id1}/{id2}", // URL with parameters
               );

И если вам нужно добавить маршрут, который принимает три параметра, вы расширяете идею:

routes.MapRoute(
                "ThreeParameterRoute", // Route name
                "{controller}/{action}/{id1}/{id2}/{id3}" // URL with parameters
               );

В контроллере для маршрута с двумя параметрами код будет выглядеть следующим образом (для надуманного примера):

public ActionResult Index(int id1, int id2)
    {
        ViewData["id1"] = id1;
        ViewData["id2"] = id2;

        return View();
    }

И последнее, на что следует обратить внимание, это то, что вы можете изменить наименование в соответствии с вашим шаблоном.В первом примере вместо id1 и id2 у вас могут быть entityId и relatedId или что-то подобное.

0 голосов
/ 22 августа 2011

Я бы пошел с чем-то, что имело бы описательные URL-адреса и не было маршрута по умолчанию:

routes.MapRoute(
  "IceCreamEdit", // Route name
  "{controller}/{action}/icecream/{iceCreamId}/menu/{menuId}" // URLwith parameters
);
0 голосов
/ 22 августа 2011

Если ваш набор действий CRUD будет повторяться с каждым настраиваемым объектом, который вы вводите в свое приложение, тогда вы можете также использовать контроллер в качестве параметра.Как и сейчас, у вас исправлен контроллер.Также я бы избегал таких длинных имен действий.Я также хотел бы избежать написания Icecream как IceCream.Просто его внешний вид.

Вероятно, у вас должен быть контроллер Menu, который обрабатывает мороженое.Это не имеет смысла, что Icecream обрабатывает свои собственные вещи, потому что он является частью чего-то другого.

Например,

routes.MapRoute( 
  "RemoveIcecreamFromMenu", // Route name 
  "menu/remove-icecream/{iceCreamId}/{menuId}", // URLwith parameters 
  new 
  { 
     controller = "Menu", 
     action = "RemoveIcecream", 
     iceCreamId = UrlParameter.Optional, // i don't think those two should be optional
     menuId = UrlParameter.Optional 
  }  
); 

Но для контроллера Icecream имеет смысл обрабатывать собственный CRUD:

routes.MapRoute( 
  "CreateIcecream", // Route name 
  "icecream/create", // URLwith parameters 
  new 
  { 
     controller = "Icecream", 
     action = "Create"
  }  
); 

routes.MapRoute( 
  "DeleteIcecream", // Route name 
  "icecream/delete/{id}", // URLwith parameters 
  new 
  { 
     controller = "Icecream",
     action = "Delete",
     id = @"\d+" // this tells the routing engine only integer are accepted
  }  
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...