2016-07-20 4 views
4

Я немного запутался в том, каким способом добиться чего-то. Мой веб-сайт может отображать поток историй для пользователя, а фид может быть одной из нескольких категорий. (например, вы можете посмотреть фид «Все истории» или фид «Мои подчинения»).ASP.NET MVC Routing vs Конкретные действия

С точки зрения обработки маршрутизации, он делает больше смысла:

1) есть действие (Home/индекс) обрабатывать различные "storyCategory" параметры с маршрутизацией, как это:

[Route("~/"), Route("")] //Index will be default route for both SiteRoot and SiteRoot/Home 
[Route("{storyCategory?}/{page?}")] 
[Route("{storyCategory?}/Page/{page?}")] 
public ActionResult Index(Story.Category storyCategory = Story.Category.None, int page = 1) 

ИЛИ

2) имеют определенное действие для каждого storyCategory вместо передачи перечисления в качестве параметра:

[Route("~/"), Route("")] //Index will be default route for both SiteRoot and SiteRoot/Home 
public ActionResult Index(int page = 1) 
public ActionResult ReadLater(int page = 1) 
public ActionResult PlanToUse(int page = 1) 

ответ

2

Если все каналы точно похожи друг на друга, с помощью нескольких действий, где параметры всегда одинаковы, то первый вариант кажется очевидным ...

Однако, если в будущем вы хотите иметь, например, другой «ReadLater» в одном из каналов (с разными параметрами), вы можете пожалеть, что выбрали первый вариант.

Я бы второй вариант по следующим причинам:

  • действия гибкость;
  • URL-адреса определяются именами действий (не жестко закодированными в верхней части вашего действия «индекс»);
  • параметры могут быть легко отрегулированы в соответствии с контекстом контроллера;
  • читаемость и ремонтопригодность кода.

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

namespace Stories 
{ 
    public class ControllersNames { 
     public const string AllStories = "AllStories"; 
     public const string MySubmissions = "MySubmissions"; 
    } 

    public class ActionsNames 
    { 
     #region AllStories 
     public const string AllStories_ReadLater = "ReadLater"; 
     public const string AllStories_PlanToUse = "PlanToUse"; 
     #endregion 

     #region MySubmissions 
     public const string MySubmissions_ReadLater = "ReadLater"; 
     public const string MySubmissions_PlanToUse = "PlanToUse"; 
     //same action but with different paramaters below 
     public const string MySubmissions_PlanToReUse = "PlanToUse"; 
     public const string MySubmissions_Store = "Store"; 
     #endregion 
    } 
} 

И где-то в вашей точке зрения вы может иметь вызовы, подобные этим:

<a ... href="@Url.Action(
     ActionsNames.MySubmissions_PlanToUse, 
     ControllersNames.MySubmissions, 
     new { page = Model.MySubmissions.IDPage })"> 

это было легче читать и следить с большим количеством действий ...

1

Я бы пошел с первым вариантом, так как не имеет смысла делать разные действия только для фильтрации статей/контента.

Также использование переходов в маршруте, по-видимому, не является идеальным выбором. Значимые строки лучше.

+0

Почему вы говорите, что перечисления будут плохими? Строки должны быть проанализированы – Michael

+0

@Michael, перечисления необходимы только целыми числами, поэтому, если вы используете их непосредственно в URI, вы получите URI, полный бессмысленных чисел, и это не хорошо. Вы можете сделать 'ToString()' на перечислениях, чтобы получить свою идентификационную строку, но люди говорят, что это вредит производительности. – VSG24

+0

У меня он настроен для перечислений. Хотя вы правы, они просто целые числа. Если строковое значение вводится в URL-адрес, оно работает. Таким образом, кажется, что есть возможность либо использовать ints, либо имя перечисления. Однако он представляет проблему, когда пользователь потенциально вводит целое число, которое не сопоставляется с допустимым значением перечисления. По-прежнему использование строки, означало бы разбор строк, что, похоже, эквивалентно компромиссу для получения строкового значения перечисления – Michael