【问题标题】:How to control URIs using MVC4 with WebAPI如何使用带有 WebAPI 的 MVC 4 控制 URIc
【发布时间】:2013-10-17 17:56:46
【问题描述】:

我观看了很多视频教程并阅读了更多文章。我不认为我见过一个回答这个问题的人,我被困住了。 :S

我使用 Web API 创建了一个 MVC4 应用程序。离开我读过的教程,我使用了标准的命名约定。比如说 /api/user 和 /api/user/id 等。

现在我想为 User 实体创建 CRUD 页面。当然,这些页面可以很好地放在 /Admin/ 文件夹下,但我无法创建一个控制器来生成 /Admin/User/Create、/Admin/User/View 等视图,因为这需要创建一个控制器名为 UserController - 但它已经为 WebAPI 创建。

用这种文件夹结构为我的实体创建 CRUD 页面似乎不是标准的,或者至少是“好的”:

Views/Admin/User/
Views/Admin/Product/
etc, etc.

这允许每个实体/表拥有自己的文件夹,其中包含自己的 Create.cshtml、Index.cshtml 等。

但同样,我已经创建了一个具有这种结构的 WebAPI:

api/User/
api/Product/

所以,现在我想创建一些管理页面来管理数据库。当我使用实体框架创建具有读/写功能的 MVC 控制器时,我不知道该给控制器命名什么来给我想要的 URI 结构。

当然,我并不真正关心控制器的名称,但我不知道获取 URI 结构需要哪些步骤。例如,我创建了一个 MVC 控制器并将其命名为 AdminProduct,但现在我必须转到 /AdminProduct/ 才能查看这些页面。

有人可以指点我吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    您可以拥有两个具有相同名称的控制器,只要它们位于不同的命名空间中即可。例如,我在项目的 /Controllers/Api 文件夹下添加了所有 System.Web.Http.ApiController 类。默认情况下,Visual Studio 会将这些控制器包含在名为 <ProjectName>.Controllers.Api 的命名空间中。然后,您可以在 /Controllers 文件夹中添加 System.Web.Mvc.Controller 类,它们将位于 <ProjectName>.Controllers 命名空间中。所以,长话短说,你可以有一个名为 UserController 的 MVC 控制器和一个名为 UserController 的 WebApi 控制器,并且没有冲突。

    您的 MVC 控制器操作的视图,例如 /User/Create/User/Delete 应该放在项目的 /Views/User/ 文件夹下 - 每个都与 UserController 中的操作同名。至于有管理页面,为什么不创建一个AdminController 或使用[Authorize] 操作过滤器对您想要保护的那些操作?

    我不确定我是否理解您的整个问题。 ASP.NET MVC 按照这种约定将控制器名称和操作绑定到视图。

    【讨论】:

    • 你回答得很好。将 WebAPI 控制器放在一个名为 API 的文件夹中是一个非常好的解决方案,我认为这可以解决我遇到的冲突。谢谢!
    • 您的解决方案很好地解决了冲突,但是当我使用 EntityFramework 创建读/写控制器时,用户文件夹会自动在 /Views/ 中创建。我尝试将它复制到 /Views/Admin/User/ 文件夹,但它不会以这种方式加载。可能是一个单独的问题。 :P
    • ...也许我将问题标记为回答得太及时了。您提到了创建一个 AdminController。我考虑过这一点,但我只是不明白文件夹结构与公共 URI 的关系。我“认为”我对每个实体/表的子文件夹感到满意。这样每个人都可以拥有自己的 CRUD .cshtml 文件。有没有办法在单个控制器中执行此操作 - AdminController?或者单个控制器是否意味着一个文件夹,其中包含该文件夹中每个实体的所有 CRUD cshtml 文件?
    • 在我看来,您对 API 控制器和 MVC 控制器之间的区别感到非常困惑。你认为你需要对你的所有 CRUD 操作都有视图吗?答案是否定的,你没有。如果您需要向用户显示数据,那么拥有视图是有意义的。但是,为什么您需要 PUT、POST 或 DELETE 操作的视图?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    相关资源
    最近更新 更多