在angularjs和mvc5之间进行通信的最佳方式是什么?

时间:2015-01-09 08:13:58

标签: asp.net-mvc angularjs api asp.net-mvc-4 asp.net-apicontroller

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

  1. 使用angularjs的最佳方法是什么?是MVC控制器还是MVC API?
  2. 我读了here api对SPA有好处。那么,我是否需要为API构建一个不同的项目?
  3. Angularjs与MVC的异步通信怎么样?
  4. 我没有找到正确的工作方向。我熟悉mvc但不熟悉API。所以,请指导我一个正确的方法!!

    提前致谢

3 个答案:

答案 0 :(得分: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
});

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

答案 1 :(得分:2)

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

当您的MVC应用程序具有适用于不同类型应用程序的API时,您需要担心的是移动应用程序等。 1.泳池服务。 2. IIS中每个工作进程的线程。 当您在不同类型的应用程序的应用程序中使用API​​或Async方法时,这些将定义应用程序的规模。

答案 2 :(得分:1)

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

从Angular调用那些方法

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

3)您可以致电ajax asynchronous - 这不是问题