4

我对在 angularjs 和 MVC5 之间传输数据有些困惑。我正在创建单页应用程序 (SPA)。

  1. 使用 angularjs 的最佳方法是什么?是 MVC 控制器还是 MVC API?
  2. 我在这里读到api 对 SPA 有好处。那么,我需要为 API 构建一个不同的项目吗?
  3. Angularjs 与 MVC 的异步通信怎么样?

我没有找到正确的工作方向。我熟悉 mvc 但不熟悉 API。所以,请指导我正确的方式!

提前致谢

4

3 回答 3

4

首先,对于当前版本的 Visual Studio (2013),“Web 表单”项目和“mvc”项目之间没有区别。这只是一个 Web 应用程序项目,你可以在里面放任何你想要的东西。

现在,根据我的经验,解决您的问题的一种很好且干净的方法是创建普通的 MVC 控制器来呈现包含 angularJS 应用程序的剃刀视图,并为 ajax 方法的 RESTful 接口创建 WebAPI 控制器。

在 angularJS 中,您实际上并不需要手动进行 ajax 调用。还有一种更方便、更强大的方式:资源。它们还与 WebAPI 设计配合得很好,因为 WebAPI 控制器与单一类型的对象(即客户)一起工作,并且通过 HTTP VERBS 允许您执行 CRUD。例如:

// assume we have a backend repository that handles the data

public HttpResponseMessage Get()
{
    return this.Request.CreateResponse(HttpStatusCode.OK, this.repository.GetAllCustomers()); 
}

public HttpResponseMessage Post(Customer customer)
{
    var modifiedCustomer = this.repository.Update(customer);
    this.repository.SaveChanges();

    return this.Request.CreateResponse(HttpStatusCode.OK, modifiedCustomer);
}

此方法查询所有可用客户并将其返回。您无需在此处定义是返回 JSON 还是 XML:WebAPI 框架读取 WebAPI 请求的 HTTP HEADERS 并根据客户端的请求序列化数据。对于您可能会使用的 JSON,它通过定义的默认 JSON 序列化程序进行序列化。您可以覆盖它以更改创建 JSON 的方式,一种常见的方法是使用带有自定义设置的 JSON.NET。

AngularJS 资源用于映射单个 URL 并在内部使用所有动词,并向您公开 $save、$query、$get 等方法,因此它们很好地结合在一起。例如:

var customerRes =  $resource('/customers');
var currentCustomers = customerRes.query(function(){ // query is mapped to the GET verb
    currentCustomers[0].email = "foo@baz.bar";
    currentCustomers[0].$save(); // default mapped to the POST verb
});

我建议您查看文档和示例以获取更多详细信息。

于 2015-01-09T08:51:26.970 回答
2

您可以将 MVC 控制器功能与 Async 和 MVC API 一起使用。在控制器异步方法中,您需要手动处理所有响应,因为 API 内置了许多功能。在控制器异步方法中,您的应用程序将处理自调用。当然,API 让您可以更灵活地处理不同的应用程序类型。

当您的 MVC 应用程序具有用于不同类型的应用程序(如移动应用程序等)的 API 时,您需要担心的更多事情。 1. 池服务。2. IIS 中每个工作进程的线程数。当您在应用程序中为不同类型的应用程序提供 API 或异步方法时,这些将定义您的应用程序的规模。

于 2015-01-09T09:22:25.997 回答
1

1)您可以创建简单Controller- 并在内部创建将返回JsonResult 的方法并通过 Angular 从 Angular 调用这些方法AJAX

2)是的 - 如果你想构建API- 你需要创建新的项目类型WebAPi(现在是 v 2.0) - 但你可以solution用 SPA将它创建为一个

3)你可以打电话ajax asynchronous- 这不是问题

于 2015-01-09T08:32:23.280 回答