Angular新手。尝试使用angular / webapi将数据传回服务器

时间:2017-02-15 15:51:58

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

我正在尝试使用webapi以角度传递数据到服务器。感谢论坛上的人们,我能够根据另一个使用实体框架和角度来填充1个下拉。接下来我要弄清楚的是如何使用webapi将屏幕数据传回服务器。

当调用角度代码时,我收到一个错误:badreq' Http请求配置必须是一个对象'

此错误显示在$ http

我在网上找到了一个示例,它显示了创建每个html控件使用的父模型的能力。对于在线示例,他们使用文本框,但我使用的是选择列表,但我认为这也应该有效。

有人可以告诉我我做错了吗?

我很感激!!

关注:此时我遇到的问题似乎是Angular saveattributecontroller中的数据状态为UNDEFINED。所以我在这一点上不相信的问题是对webapi的调用,但数据没有从"详细信息"在HTML中。

关注2:根据洛伦佐的评论如下。通过将attributevaluecontroller放在提交按钮周围,我现在可以看到传递给attribute.js中的saveattributecontroller的数据是好的。我还意识到我需要在saveattributecontroller中引用Data.A和Data.V。但现在似乎没有发生对WebAPIAttribute控制器的调用。我尝试了我原来的方式和之前建议的另一种方式,但是对控制器的调用似乎从未经历过。任何人都可以帮我吗?

跟进3:当我单步执行角度javascript时,我发现的错误是资源无法找到。所以我假设它没有找到webapi控制器由于某种原因。它可能非常简单,但我没有看到它。



var myapp = angular.module('attributeapp', []);
 
    myapp.controller('attributecontroller', function ($scope, $http) {
        $http.get('/Attribute/AttributeIndex/').then(function (response) {
            $scope.Attributes = response.data;
        })
    })
 
 
    myapp.controller('attributevaluecontroller', function ($scope, $http) {
        $scope.getattributevalues = function (id)
        {
            $http.get('/Attribute/getattributevalues/' + id).then(function (response) {
                $scope.A = id;
                $scope.AttributeValues = response.data;
            })
        }
    })
 
 
    myapp.controller('saveattributecontroller', function($scope, $http){
        $scope.attributesave = function (Data) {
            var GetAll = new Object();
            GetAll.AttributeKey = Data.AttributeKey;
            GetAll.AttributeValueKey = Data.AttributeValueKey;
            $http({
                url: "WebAPIAttribute/attributesave",
                dataType: 'json',
                method: 'POST',
                data: GetAll,
                headers: {
                    "Content-Type": "application/json"
                }
            }).success(function (response) {
                $scope.value = response;
            })
               .error(function (error) {
                   alert(error);
               });
        }
    })
 

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script src="Scripts/angular.js"></script>
    <script src="Scripts/attribute.js"></script>
</head>
<body data-ng-app="attributeapp">
    <div data-ng-controller="attributecontroller">
         <span data-ng-controller="attributevaluecontroller">
         <select data-ng-model="detail.A" data-ng-change="getattributevalues(detail.A)" data-ng-options="Attribute.Attribute_Key as Attribute.Attribute_Desc for Attribute in Attributes"><option value="">--Select--</option></select><br />{{detail.A}}
         <select data-ng-model="detail.V" data-ng-options="Attribute_Value.Attribute_Value_Key as Attribute_Value.Attribute_Value_Desc for Attribute_Value in AttributeValues"><option value="">--Select--</option></select>{{detail.V}}
         </span>
        <br />
        <span data-ng-controller="saveattributecontroller">
            <input type="button" value="submit" data-ng-click="attributesave(detail)"/>
        </span>
    </div>
</body>
</html>
&#13;
&#13;
&#13;

&#13;
&#13;
//AttributeControler.cs
using System;
using System.Collections.Generic;
using MVC_APP1.Models;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
 
namespace MVC_APP1.Controllers
{
    public class AttributeController : Controller
    {
        //
        // GET: /Attribute/
 
        public ActionResult AttributeIndex()
        {
            Cafe_CPDEntities objEntity = new Cafe_CPDEntities();
            var data = objEntity.Attributes.ToList();
            return Json(data, JsonRequestBehavior.AllowGet);
        }
 
        public ActionResult getattributevalues(int id)
        {
            Cafe_CPDEntities objEntity = new Cafe_CPDEntities();
            var data = objEntity.Attribute_Value.Where(m=>m.Attribute_Key==id);
            //string test = data.FirstOrDefault().Attribute_Value_Desc;
            return Json(data, JsonRequestBehavior.AllowGet);
        }
        public ActionResult attributesave(List<int> ReturnData)
        {
            return null;
        }
 
    }
}
&#13;
&#13;
&#13;

&#13;
&#13;
// WebAPIAttributeController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
 
namespace MVC_APP1.Controllers
{
    public class WebAPIAttributeController : ApiController
    {
        public class GetAll
        {
            public string AttributeKey { get; set; }
            public string AttributeValueKey { get; set; }
        }
        [HttpPost]
        public string attributesave(HttpRequestMessage request,
            [FromBody] GetAll getAll)
        {
            return "Data Reached";
        }
    }
}
 
 
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:0)

尝试

    $scope.attributesave = function (Data) {
                var GetAll = new Object();
                GetAll.AttributeKey = Data.AttributeKey;
                GetAll.AttributeValueKey = Data.AttributeValueKey;
                $http.post("WebAPIAttribute/attributesave", getAll)
                   .then(function(response){
                      //here your operations
                   })
                }

答案 1 :(得分:0)

(我认为我发布的时间早了,但是没有保存)

我想出了最后一部分。我需要在路线上添加api /。

API / WebAPIAttributes / attributesave /

现在,对webapi的调用将通过并从屏幕传递数据。

非常感谢那些帮助回答我之前遇到的问题的人。