使用angular $ http得到asp net web api

时间:2015-02-16 01:14:23

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

我正在尝试使用asp web api来使用angular填充html表。如果我在firefox中调试一切都很好(我假设因为我的web服务是在json中返回的)但是在ie和chrome中它没有加载(web服务在这些浏览器中返回xml)。在webapiconfig中,我试图通过添加来使服务返回json。

    Dim appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(Function(t) t.MediaType = "application/xml")
    config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType)

当我在所有浏览器中导航到api它返回json时,这似乎有效。但是$ http get现在仍在使用chrome和ie。

即我得到以下错误

    Unhandled exception at line 21, column 406 in http://localhost:53175/Scripts/angular.min.js

    0x800a139e - JavaScript runtime error: [$injector:nomod] http://errors.angularjs.org/1.3.13/$injector/nomod?p0=api%2Fproducts

这是我的获取

    angular.module("api/products").constant("dataUrl", "sportstore.json").controller("sportsStoreCtrl", function ($scope, $resource, dataUrl) {
    $scope.data = {};

    var resultPromise = $resource(dataUrl);
    resultPromise.success(function (data) {
        $scope.data.products = data;
    })


    });

有什么想法吗?

其他信息

这是我的api控制器

<pre>
Imports System.Net
Imports System.Web.Http
Imports apitoform.productRepository

Namespace Controllers
    Public Class productController
        Inherits ApiController

    Private repo As productRepository = productRepository.Current

    Public Function GetAllProducts() As IEnumerable(Of product)
        Return repo.GetAll()
    End Function

    End Class
    End Namespace
</pre>

这里是正在返回的j_son(如果它看起来很熟悉,我正在通过专业的Angular书)

2 个答案:

答案 0 :(得分:1)

很抱歉这是c#代码,但它应该说明仅从web api返回Json的基本思路。它来自我的一个项目的实际代码。

 [Route("api/users/getbyemail/")]
    public HttpResponseMessage GetByEmail(string email)
    {
        try
        {
            var result = _userService.GetByEmail(email);

            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "value");
            response.Content = new ObjectContent(typeof(IEnumerable<UserViewModel>), result ?? new List<UserViewModel>(), new JsonMediaTypeFormatter());
            response.Headers.Add("Access-Control-Allow-Origin", "*");
            return response;
        }
        catch (Exception ex)
        {
            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message);
            response.Headers.Add("Access-Control-Allow-Origin", "*");
            return response;
        }
    }

所以你要用Json内容返回HttpResponseMessage。

在我只需要从其中一个MVC控制器返回数据的情况下,我也做了类似的事情,这更容易:

public ActionResult Get(string guid)
        {
            var profileVm = _profileService.Get(guid);
            if (profileVm != null)
            {
                return Json(profileVm, JsonRequestBehavior.AllowGet);
            }

            return new HttpNotFoundResult();
        }

答案 1 :(得分:0)

带有1个参数的angular.module返回具有该名称的模块 - 您需要使用依赖模块列表定义模块(如果没有则为空数组),如下所示:

angular.module("api/products", [])...

引用的错误提供了有关问题详情的错误(角度非常好的错误消息):https://docs.angularjs.org/error/$injector/nomod?p0=api%2Fproducts