2014-01-17 3 views
1

У меня есть контроллер, который имеет значение. Я хочу перенаправить на действие другого контроллера на основе значения. Я использовал простую структуру if, но я не уверен, что это самый чистый способ сделать это. Есть ли лучший способ решить эту проблему?Перенаправление на другое действие, основанное на переменной

Текущий код ниже.

+0

Ваш вопрос лучше подходит для codereview.stackexchange.com – VahidNaderi

+0

Я не знал, что сайт существует! Узлы обмена сайтами появляются быстрее, чем я могу отслеживать. Согласен, хотя. –

ответ

2

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

  1. В качестве правила конвенции об именах локальные переменные должны быть названы в малом случае. Посмотрите, как синтаксис синтаксиса SO окрашивал ваши локальные имена переменных, как если бы они были именами классов.
  2. Если единственная цель вашего if ... else if ... else состоит в том, чтобы делать разные вещи в зависимости от значения переменной (как в вашем коде), лучше использовать оператор switch.

Кроме этого, я не думаю, что ваш код каким-либо образом «плох».

EDIT Кстати, если вы ищете вариант один вкладыш (но менее читаемым):

[ValidateInput(false)] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Search(SearchViewModel searchViewModel) 
{ 
    return RedirectToAction(searchViewModel.SelectedCategory == 1 ? "Artists" : searchViewModel.SelectedCategory == 2 ? "Albums" : "Tracks", "Search"); 
} 
+1

+1 для рекомендации оператора switch. Спасибо, что код плохой, он просто не чувствует себя «правильным» для меня. –

+0

Я ценю это @DavidBainbridge, я просто не могу придумать никакого другого «лучшего» способа. Конечно, вы можете избавиться от магических строк, но это будет означать определение новых переменных (возможно, перечислений), и это будет затруднять ситуацию. –

+0

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. –

2

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

public enum Category { 
    [RelatedAction("Artists")] 
    Artists, 
    [RelatedAction("Albums")] 
    Albums, 
    [RelatedAction("Tracks")] 
    Tracks 
} 

и тогда у вас будет только одна строка внутри Search метода:

return RedirectToAction(searchViewModel.SelectedCategory.GetRelatedAction(), "Search"); 
+1

Наверх проголосовали, поскольку это намного чище. Благодарю. –

+0

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. –

+0

@AdrianThompsonPhillips: Или, конечно, вы правы, но идея по-прежнему такая же - прост в обслуживании, легко расширяется. В любом случае, спасибо, исправит это. – blez

1

Вы можете использовать переключатель заявление:

string action; 

switch (selectedCategory) 
{ 
    case 1: 
     action = "Artists"; 
     break; 
    case 2: 
     action = "Albums"; 
     break; 
    default: 
     action = "Tracks"; 
     break; 
} 

return RedirectToAction(action, "Search"); 
Смежные вопросы