【问题标题】:ASP.NET MVC Routing vs Specific ActionsASP.NET MVC 路由与特定操作
【发布时间】:2016-07-20 16:57:51
【问题描述】:

我对完成事情的方式有点困惑。我的网站可以向用户显示故事提要,提要可以是多个类别之一。 (例如,您可以查看“所有故事”供稿或“我的提交”供稿)。

在处理路由方面,是否更有意义:

1) 让动作(主页/索引)处理不同的“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)

【问题讨论】:

    标签: c# asp.net .net asp.net-mvc url-routing


    【解决方案1】:

    如果您的所有提要彼此完全相同,只需几个操作参数始终相同,那么第一个选项似乎很明显......

    但是,如果将来您想在其中一个提要中使用不同的“ReadLater”(使用不同的参数),您可能会后悔选择了第一个选项。

    出于以下原因,我会选择第二个选项:

    • 动作灵活;
    • URL 由操作名称定义(不是硬编码在“索引”操作之上);
    • 可以根据控制器的上下文轻松调整参数;
    • 代码的可读性和可维护性。

    此外,如果您的提要增长超出您的预期,您可以创建一个 constants 文件,在其中以这种方式关联每个控制器及其操作:

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

    更容易阅读和跟进更多操作...

    【讨论】:

      【解决方案2】:

      我会选择第一个选项,因为仅仅为了过滤文章/内容而进行不同的操作是没有意义的。

      在路由中使用枚举似乎也不是完美的选择。有意义的字符串更好。

      【讨论】:

      • 为什么说枚举不好?必须解析字符串
      • @Michael,枚举只是整数,所以如果你直接在 URI 中使用它们,你最终会得到一个充满无意义数字的 URI,这并不好。您可以在枚举上执行 ToString() 以获取其标识字符串,但人们说这会损害性能。
      • 我已经为枚举设置了它。虽然你是对的,但它们只是整数,如果在 url 中输入字符串值,它就可以工作。因此,似乎可以选择使用整数或枚举名称。但是,当用户可能输入一个未映射到有效枚举值的整数时,它确实会出现问题。仍然使用字符串,将意味着解析字符串,这似乎是获取枚举的字符串值的等效折衷
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 2018-03-16
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多