我正在尝试构建我的第一个企业 ASP.NET MVC 4 Web应用程序,我在解决正确的事情流程时遇到了一些问题。
假设我有一个Clients.cshtml视图,它有相应的ClientsController,基类Controller
。
我希望客户端视图显示系统中所有客户端的列表。
由于分离关注,我认为处理此类请求的正确位置是ApiController
,而不是Controller
本身,我认为应该或多或少地限制在UI任务中。因此,我在getClients()
中添加方法ApiController
,它将返回包含所有客户端的JSON对象。
现在,如何从我的视图或Controller
中使用此功能?
我相信,一种方法是使用javascript处理它;加载视图时,我使用ApiController
等来调用jQuery
,并以异步方式显示结果。
但我不确定这是正确的做法,是吗?我相信这是一种方法,但我想知道替代方案,或更好(更常规)的方法来处理这个问题。
谢谢
答案 0 :(得分:2)
如果您不在其他网络应用或移动应用中使用该API,则无需开发Web API。 Web API旨在为多个消费者提供单一核心的简单方法,例如Android应用程序,iOS,Web应用程序甚至是定制的第三方消费者。
因此,如果您的应用不会以这种方式使用,则无需使用API控制器。
如果你想分开关注点,我建议你在同一个解决方案中创建一个不同的项目(一个类库项目),该项目将是你的内部API。然后你的MVC项目将使用你的内部API,试图让你的控制器尽可能保持皮肤。我建议你阅读this article(它适用于Ruby on Rails,但所有概念都适用于MVC .NET)。
答案 1 :(得分:0)
您正在寻找的是一种将相同数据显示在您的视图(服务器端呈现)和您的javascript(通过JSON API)的方法。
有很多方法可以解决这个问题。正如您所提到的,您可以创建一个单独的API控制器,但根据我的经验,一旦您超越少数API调用,这有点臭。理想情况下,您希望您的API具有与普通控制器相同的RESTful架构,这意味着您将重复添加,列出和删除对象的许多相同逻辑。
我发现一个很好的选择是允许每个控制器返回一个视图或JSON,具体取决于请求的格式。这可以扩展为包括XML,CSV或您希望从客户端使用的任何其他格式。这个方法有excellent blog post Michael Morton {{3}}。它可能不是您正在寻找的,但最终结果看起来像这样:
public ActionResult Index()
{
List<Client> clients = db.Clients.ToList();
return RespondTo(format =>
{
format.Html = () => View(clients);
format.Json = () => Json(clients);
});
}