AngularJS $ http.put不适用于ASP.NET MVC控制器

时间:2015-07-07 08:31:58

标签: asp.net-mvc angularjs

我正在尝试创建一个简单的页面,我使用$ http.put将一些数据发送到服务器。

脚本代码

<script>
var myApp = angular.module("myApp", []);
myApp.controller("HttpPostController", function ($scope, $http) {

    $scope.SendHttpPostData = function () {

        var data = $.param({
            firstName: $scope.firstName,
            lastName: $scope.lastName,
            age : $scope.age
        });

        $http.put('/ServerRequest/PutDataResponse', data)
        .success(function (data, status, headers, config) {
            $scope.ServerResponse = data;
        })
        .error(function (data, status, header, config) {
            $scope.ServerResponse =  htmlDecode("Data: " + data +
                "\n\n\n\nstatus: " + status +
                "\n\n\n\nheaders: " + header +
                "\n\n\n\nconfig: " + config);
        });
    };

});</script>

我的HTML代码

<div ng-app="myApp" ng-controller="HttpPostController">
<form ng-submit="SendHttpPostData()">
    <p>First Name: <input type="text" name="firstName" ng-model="firstName" required /></p>
    <p>Last Name: <input type="text" name="lastName" ng-model="lastName" required /></p>
    <p>Age : <input type="number" name="age" ng-model="age" required /></p>
    <input type="submit" value="Submit" />
    <hr />
    {{ ServerResponse }}
</form></div>

ASP.NET MVC控制器操作方法

    [HttpPut]
    public ContentResult PutDataResponse(string firstName, string lastName, int age)
    {
        return Content("First name: " + firstName +
            " | Last name: " + lastName +
            " | Age: " + age +
            " | Request Type: " + Request.RequestType.ToString());
    }

我收到的错误消息是

TTP错误404.0 - 未找到您要查找的资源已被删除,名称已更改或暂时不可用。最有可能的原因:Web服务器上不存在指定的目录或文件。该网址包含印刷错误。自定义筛选器或模块(如URLScan)限制对文件的访问。您可以尝试的事项:在Web服务器上创建内容。查看浏览器URL。检查失败的请求跟踪日志,并查看哪个模块正在调用SetStatus。

所以在ASP.NET MVC中它不起作用。 (POST和GET工作)。我尝试使用ASP.NET MVC Web API,它运行正常。我可以使用mvc web api的PUT方法发送和接收响应。

问题是为什么它在ASP.NET MVC中不起作用,即使方法动词是[HttpPut]。

由于

2 个答案:

答案 0 :(得分:3)

好的,经过多方努力,我找到了解决方案。实际上,问题是默认情况下ASP.NET MVC不允许&#34; PUT&#34;或&#34;删除&#34;请求类型,所以我们需要在web.config文件中启用它们,如下所示。

  <system.webServer>
<modules>
  <remove name="FormsAuthentication" />
  <remove name="FormsAuthenticationModule" />
</modules>
<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />

  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

</handlers>
  </system.webServer>

注意ExtensionlessUrlHandler-Integrated-4.0处理程序。这有所不同。这允许所有类型的动词都可以接受,因此甚至PUT请求现在也适用于ASP.NET MVC。

答案 1 :(得分:0)

我怀疑模型绑定的工作方式不同。你传递的是:

glance(lm(this_vector ~ that_vector))$statistic

具有 3个属性的对象。然而,您的MVC控制器方法仅在寻找 3个参数 var data = $.param({ firstName: $scope.firstName, lastName: $scope.lastName, age : $scope.age });

您可以更改MSC控制器方法以期望具有3个属性的对象,即:

string firstName, string lastName, int age

更改请求以传递URL中的参数:

public class myViewModel
{
    string firstName; 
    string lastName;
    int age;
}

public ContentResult PutDataResponse(myViewModel formData)

另外,检查你的路线:'/ ServerRequest / PutDataResponse'。如果您使用默认路由,这将映射到Your / ServerRequestController和第一个HttpPut方法。从您的示例中我不知道您的控制器上是否有多个HttpPut方法。如果这样做,您可以将attribute route [Route(“ServerRequest / PutDataResponse”)]添加到MVC方法的顶部。