代码之家  ›  专栏  ›  技术社区  ›  Chris Nicola

ASP.NET w/Restful路由:从资源中访问(子)控制器

  •  1
  • Chris Nicola  · 技术社区  · 16 年前

    我不确定如何表达这一点,但我经常在RoR应用程序中看到这样一种模式:

    /Post/postid/Comment/commentid

    或

    本质上是在模型中,因为项目具有任务,所以可以从项目资源中访问TaskController。

    路线=>行动

    /{Controller}/{id}=>Show()

    我不会透露所有细节,任何人都可以通过谷歌搜索SimplyRestfulRouting查看。我想知道是否有一种一致的方式来允许:

    /{Controller}/{id}/{Controller}/{id}类型语法。

    很明显,如果这是一个关于配置风格的约定,而不仅仅是设置大量路由,那么这将是一个理想的选择。

    2 回复  |  直到 16 年前
        1
  •  0
  •   Mark van Proctor    16 年前

    然而,我确实看到了它对“依赖”类型的好处,例如当没有项目的任务无法存在时,通过/Project/projectd/Tasks/TaskId访问它们。

    public ActionResult Tasks(string id)
    {
        Project projectToDisplay = Repository.GetProject(id);
        ViewModel["Tasks"] = Repository.GetTasksForProject(projectToDispaly);
        return View(projectToDisplay);
    }
    

    显然,使用强类型ViewModel可以改进这一点。

    作为参考,my repository(特定于实体框架)具有以下代码:

    public Project GetProject(int id)
    {
        return _entities.Projects.FirstOrDefault(m => m.Id == id);
    }
    
    public IList<Task> GetTasksForProject(Project project)
    {
        return _entities.Tasks.Where(m => m.Project.Id == project.Id).ToList();
    }
    

    或者,使用Entity Framework,您可以在存储库中执行以下操作:

    public Project GetProject(int id)
    {
        return _entities.Projects.Include("Tasks").FirstOrDefault(m => m.Id == id);
    }
    

    然后控制器只需要:

    public ActionResult Tasks(string id)
    {
        return View(Repository.GetProject(id));
    }
    

    这是一个有点像ViewModel的模型。

    (注意:此代码已根据您的项目/任务上下文进行了修改,因此它不是我的实际代码。如果这段代码不起作用或有错误,我道歉,我已经有效地重新编写了它,因此可能会有打字错误/等等。)

        2
  •  0
  •   Chris Nicola    16 年前

    我已经找到了答案,这就是史蒂夫·霍奇基斯的休息路线。它比MVCContrib附带的要灵活得多,并且允许我谈论的这类事情,以及更多。

    http://stevehodgkiss.com/2009/10/11/restful-routes-for-asp-net-mvc.html

    推荐文章