MVC 4 中的关注点和 API 控制器分离



我正在尝试构建我的第一个企业ASP.NET MVC 4Web应用程序,但在弄清楚正确的事情流程时遇到了一些问题。

假设我有一个视图 Clients.cshtml,它有相应的 ClientController,基类Controller

我希望"客户端"视图显示系统中所有客户端的列表。

由于关注点分离,我认为处理此类请求的正确位置是ApiController,而不是Controller本身,我认为它应该或多或少地局限于 UI 任务。因此,我在ApiController中添加了方法getClients(),它将返回一个包含所有客户端的 JSON 对象。

现在,我如何从我的视图或Controller中使用它? 我相信,一种方法是使用 javascript 来处理它;加载视图时,我使用jQuery等调用ApiController,并异步显示结果。

但我不确定这是正确的方法,是吗?我相信这是一种方法,但我想知道替代方案,或者更好(更传统)的处理方法。

谢谢

如果您不会在其他 Web 应用或移动应用中使用该 API,则无需开发该 API。 Web API 旨在为多个消费者提供单一内核的简单方法,例如 android 应用程序、iOS、Web 应用程序甚至自定义第三方消费者。

因此,如果你的应用不会以这种方式使用,则无需使用 API 控制器。

如果要分离关注点,我建议您在同一解决方案中创建不同的项目(类库项目),该项目将是您的内部 API。然后,您的 MVC 项目将使用您的内部 API,尝试让您的控制器尽可能保持皮肤。我建议您阅读这篇文章(它适用于Ruby on Rails,但所有概念都适用于MVC .NET)。

似乎您正在寻找一种将相同数据呈现给视图(服务器端渲染)和 JavaScript(通过 JSON API)的方法。

有多种方法可以做到这一点。正如你提到的,你可以创建一个单独的 API 控制器,但根据我的经验,一旦你超越了少数 API 调用,这就会有点臭。理想情况下,您希望 API 具有与普通控制器相同的 RESTful 架构,这意味着您将重复许多相同的逻辑来添加、列出和删除对象。

我发现的一个很好的替代方案是允许每个控制器返回视图或 JSON,具体取决于请求的格式。这可以扩展为包括 XML、CSV 或您希望从客户端使用的任何其他格式。迈克尔·莫顿(Michael Morton)有一篇关于这种方法的优秀博客文章。它可能不完全是您要找的,但最终结果如下所示:

public ActionResult Index()
{
List<Client> clients = db.Clients.ToList();
return RespondTo(format =>
{
format.Html = () => View(clients);
format.Json = () => Json(clients);
});
}

最新更新