2014-01-17 59 views
1

我有一個具有值的控制器。我想根據值重定向到另一個控制器的操作。我已經使用了一個簡單的結構,但我不確定這是否是最簡單的方法。有沒有更好的方法來解決這個問題?重定向到基於變量的另一個動作

我目前的代碼如下。

// Get Search Results 
    [ValidateInput(false)] 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Search(SearchViewModel searchViewModel) 
    { 
     var SelectedCategory = searchViewModel.SelectedCategory; 
     var SearchText = searchViewModel.SearchText; 

     if (SelectedCategory == 1) 
     { 
      return RedirectToAction("Artists", "Search"); 
     } 
     else if (SelectedCategory == 2) 
     { 
      return RedirectToAction("Albums", "Search"); 
     } 
     else 
     { 
      return RedirectToAction("Tracks", "Search"); 
     } 
    } 
+0

你的問題更好適合codereview.stackexchange.com – VahidNaderi

+0

我沒有意識到該網站存在!堆棧交換站點顯得比我能跟蹤的速度更快。 雖然同意。 –

回答

2

我不認爲有比你已經提供的更好的解決方案。這裏和那裏只有小提示:

  1. 作爲命名約定規則,局部變量應該用小寫命名。看看SO語法突出顯示器如何將您的本地變量名稱上色,就好像它們是類名一樣。
  2. 如果您的if ... else if ... else的唯一目的是根據變量的值(如您的代碼中的值)做不同的事情,則最好使用switch語句。

除此之外,我不認爲你的代碼在任何方式「不好」。

編輯順便說一句,如果你正在尋找一個班輪版本(但不讀):

[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

'action'和'controller'在你的'RedirectToAction()'中是錯誤的。 –

2

我相信我的回答太快了。不管怎樣,我想這Category是一個枚舉(如果它不是,也許它應該是),這樣你就可以添加一個屬性是這樣的:

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

,然後你將有隻有一行內Search方法:

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

上投票,因爲這是一個更清潔。謝謝。 –

+0

'action'和'controller'在你的'RedirectToAction()'中是錯誤的。 –

+0

@AdrianThompsonPhillips:或者當然,你是對的,但這個想法仍然是一樣的 - 易於維護,易於擴展。無論如何,謝謝你,將解決它。 – blez

1

你可以使用switch語句:

string action; 

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

return RedirectToAction(action, "Search"); 
相關問題