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

C# 重定向到基于变量的另一个操作,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我有一个控制器,它有一个值。我想根据该值重定向到另一个控制器的操作。我使用了一个简单的if结构,但我不确定这是最干净的方法。有没有更好的办法来解决这个问题 我现在的代码如下 // Get Search Results [ValidateInput(false)] [AcceptVerbs(HttpVerbs.Post)] public ActionResult Search(SearchViewModel searchViewModel) { va

我有一个控制器,它有一个值。我想根据该值重定向到另一个控制器的操作。我使用了一个简单的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");
        }
    }

我想我回答得太快了。无论如何,我假设
Category
是一个枚举(如果不是,也许应该是),因此可以添加如下属性:

public enum Category {
    [RelatedAction("Artists")]
    Artists,
    [RelatedAction("Albums")]
    Albums,
    [RelatedAction("Tracks")]
    Tracks
}
然后在
Search
方法中只有一行:

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

我想我回答得太快了。无论如何,我假设
Category
是一个枚举(如果不是,也许应该是),因此可以添加如下属性:

public enum Category {
    [RelatedAction("Artists")]
    Artists,
    [RelatedAction("Albums")]
    Albums,
    [RelatedAction("Tracks")]
    Tracks
}
然后在
Search
方法中只有一行:

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

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

  • 作为命名约定规则,局部变量的命名应使用小写。看看语法高亮如何将局部变量名着色为类名
  • 如果你的
    的唯一目的是。。。否则如果。。。else
    是根据变量的值执行不同的操作(正如代码中所示),最好使用switch语句
  • 除此之外,我不认为你的代码在任何方面是“坏的”

    顺便说一句,如果您正在寻找一行程序版本(但可读性较差),请编辑


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

  • 作为命名约定规则,局部变量的命名应使用小写。看看语法高亮如何将局部变量名着色为类名
  • 如果你的
    的唯一目的是。。。否则如果。。。else
    是根据变量的值执行不同的操作(正如代码中所示),最好使用switch语句
  • 除此之外,我不认为你的代码在任何方面是“坏的”

    顺便说一句,如果您正在寻找一行程序版本(但可读性较差),请编辑


    您可以使用switch语句:

    string action;
    
    switch (selectedCategory)
    {
        case 1:
            action = "Artists";
            break;
        case 2:
            action = "Albums";
            break;
        default:
            action = "Tracks";
            break;
    }
    
    return RedirectToAction(action, "Search");
    

    您可以使用switch语句:

    string action;
    
    switch (selectedCategory)
    {
        case 1:
            action = "Artists";
            break;
        case 2:
            action = "Albums";
            break;
        default:
            action = "Tracks";
            break;
    }
    
    return RedirectToAction(action, "Search");
    


    你的问题更适合codereview.stackexchange.comI,我不知道这个网站存在!堆栈交换站点的出现速度超出了我的跟踪范围。同意。你的问题更适合codereview.stackexchange.comI,我不知道这个网站存在!堆栈交换站点的出现速度超出了我的跟踪范围。同意。建议转换声明+1。谢谢,这并不是因为代码不好,只是我觉得不“正确”。我很感激@davidbanbridge,我只是想不出任何其他“更好”的方法。当然,您可以去掉神奇的字符串,但这意味着定义新的变量(可能是枚举),这将使情况变得过于复杂。
    action
    controller
    在您的
    RedirectToAction()
    @AdrianThompsonPhillips中是错误的。+1推荐了一个switch语句。谢谢,这并不是因为代码不好,只是我觉得不“正确”。我很感激@davidbanbridge,我只是想不出任何其他“更好”的方法。当然,你可以去掉神奇的字符串,但这意味着定义新的变量(可能是枚举),这将使情况变得过于复杂。
    action
    controller
    在你的
    RedirectToAction()
    @AdrianThompsonPhillips谢谢,修正了这个问题。
    action
    controller
    在您的
    RedirectToAction()
    @AdrianThompsonPhillips:当然,您是正确的,但想法仍然是一样的-易于维护,易于扩展。无论如何,谢谢你,我会解决的。@blez不用担心,这是一个有趣的解决方案。我只是觉得我应该提到它,以供其他MVC初学者阅读此答案时参考,以防他们看不出什么不起作用。
    action
    controller
    在您的
    RedirectToAction()
    @AdrianThompsonPhillips:当然,您是对的,但想法仍然是一样的——易于维护,易于扩展。无论如何,谢谢你,我会解决的。@blez不用担心,这是一个有趣的解决方案。我只是想提一下,以备其他MVC初学者阅读此答案时参考,以防万一他们看不出什么不起作用。