基于变量重定向到另一个操作

时间:2014-01-17 09:21:13

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我有一个有价值的控制器。我想根据值重定向到另一个控制器的操作。我使用了一个简单的if结构,但我不确定这是最干净的方法。有没有更好的方法来解决这个问题?

我目前的代码如下。

// 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");
        }
    }

3 个答案:

答案 0 :(得分:2)

我相信我回答得太快了。无论如何,我认为Category是一个枚举(如果不是它应该是),所以你可以添加这样的属性:

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

然后在Search方法中只有一行:

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

答案 1 :(得分:2)

我认为没有比你已经提供的解决方案更好的解决方案。这里和那里只有小小的提示:

  1. 作为命名约定规则,局部变量应以小案例命名。请参阅SO语法高亮显示器如何将您的本地变量名称着色,就像它们是类名一样。
  2. 如果if ... else if ... else的唯一目的是根据变量的值(就像在代码中那样)做不同的事情,最好使用switch语句。
  3. 除此之外,我不认为你的代码有任何“坏”。

    编辑顺便说一下,如果您正在寻找单行版本(但不太可读):

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

答案 2 :(得分:1)

您可以使用switch语句:

string action;

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

return RedirectToAction(action, "Search");