具有Restful Routes的ASP.NET:从资源中访问(子)控制器

时间:2009-12-19 19:25:11

标签: asp.net-mvc rest asp.net-mvc-routing

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

/后/帖子ID /注释/ commentid

/项目/专案编号/任务/ taskid的

基本上在模型中,因为Project有Tasks,你可以从项目资源中访问TaskController。

现在我已经开始使用MVCContrib的SimplyRestfulRouting和ASP.NET MVC了,所以我有以下格式:

路线=>操作

/ {Controller} =>指数()

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

我不会深入了解所有细节,任何人都可以谷歌SimplyRestfulRouting看到。我想知道是否有一致的方式允许:

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

显然,如果这是一个超过配置风格的约定而不仅仅是设置大量路线,那将是理想的。

2 个答案:

答案 0 :(得分:0)

我喜欢这个概念,我想转到/ Project / ProjectId / Tasks并查看该项目的任务的过滤视图。就个人而言,我并不介意,如果“特定于项目”的视图(例如details / show / update / etc)返回/ Task / TaskId。

但是,我确实看到它如何对“依赖”类型有益,例如当一个任务在没有项目的情况下不存在时,可以通过/Project/ProjectId/Tasks/TaskId访问它们。 p>

为了实现我的版本,我在Project控制器中有一个Action,如下所示:

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

显然,使用强类型的ViewModel可以改善这种情况。

作为参考,我的存储库(特定于实体框架)具有以下代码:

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-esque的一点点。

(注意:此代码已经适应了您的项目/任务上下文,因此它不是我的实际代码。如果此代码不起作用或有错误,我道歉,我已经有效地重写了它,所以那里可能是拼写错误/等。)

答案 1 :(得分:0)

我找到了答案,这是Steve Hodgekiss的“Restful Routes”。它比MVCContrib附带的灵活性更灵活,并允许我正在谈论的那种东西,以及更多。

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