ASP.NET MVC路由与特定操作

时间:2016-07-20 16:57:51

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

我对完成某项工作的方式感到有点困惑。我的网站可以向用户显示故事Feed,并且Feed可以是多个类别之一。 (例如,您可以查看"所有故事" Feed,或者#34;我提交的内容和#34; Feed。)

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

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

OR

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)

2 个答案:

答案 0 :(得分:2)

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

然而,如果将来你想拥有一个不同的" ReadLater"在其中一个Feed中(使用不同的参数),您可能会后悔选择第一个选项。

出于以下原因,我会采取第二种选择:

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

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

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

更容易阅读并采取更多行动......

答案 1 :(得分:1)

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

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