【问题标题】:AngularJS $http.put doesn't work with ASP.NET MVC controllerAngularJS $http.put 不适用于 ASP.NET MVC 控制器
【发布时间】:2015-07-07 08:31:58
【问题描述】:

我正在尝试创建一个简单的页面,我在其中使用 $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 服务器上不存在指定的目录或文件。 URL 包含印刷错误。自定义过滤器或模块(例如 URLScan)限制对文件的访问。您可以尝试的方法: 在 Web 服务器上创建内容。查看浏览器 URL。检查失败的请求跟踪日志,看看哪个模块在调用 SetStatus。

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

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

谢谢

【问题讨论】:

  • 如果您在浏览器开发人员工具的“网络”选项卡中检查请求会是什么样子?
  • 数据:IIS 8.0 详细错误 - 404.0 - 未找到。阅读我上面帖子的最后一部分(斜体)。
  • 感谢 Ric,但现在情况并非如此。 ASP.NET MVC Web API 现在允许 HttpPut 请求类型,正如我在上面的帖子中提到的,这里是示例 techfunda.com/Howto/angularjs/573/http-put-server-request 这个问题只有在我们使用 ASP.NET MVC 控制器时才会出现。
  • 我的意思是发送请求时使用的 url。我可以清楚地看到您的问题文本中的错误。

标签: asp.net-mvc angularjs


【解决方案1】:

好的,经过一番努力,我找到了解决方案。实际上,问题在于默认情况下 ASP.NET MVC 不允许“PUT”或“DELETE”请求类型,因此我们需要在 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。

【讨论】:

    【解决方案2】:

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

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

    一个对象,具有 3 个属性。然而,您的 MVC 控制器方法正在寻找 3 个参数string firstName, string lastName, int age

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

    public class myViewModel
    {
        string firstName; 
        string lastName;
        int age;
    }
    
    public ContentResult PutDataResponse(myViewModel formData)
    

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

    $http.get('/ServerRequest/PutDataResponse?firstname=bob&lastname=smith&age=12')
    

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

    【讨论】:

    • 感谢 Sarin,我只有一个 HttpPut,它是在上面的代码 sn-p 中编写的。我也尝试使用查询字符串传递。我想发送 $http.put 而不是 $http.get。这里的问题是它只是在客户端本身引发错误。如果它在服务器上运行并且我没有获取数据,那么这是有道理的,但 AngularJS 无法在 mvc 操作方法上发送 $http.put 请求。如前所述,如果我的操作方法是 ASP.NET MVC Web API,它就可以工作。
    • 我怀疑你的路由是错误的。即您请求数据的 url 与 mvc 操作方法的 url 不同。请将您的路由配置文件的内容发布到您的 mvc 应用程序中。另外,请确认实际的请求网址,如上述评论在网络选项卡中建议的那样或使用提琴手。
    • Sarin,我可以确认请求的 url 与 $http.get 中写的相同。我有默认的 RouteConfig,routeconfig 文件没有变化。当我从 PutDataResponse 操作方法中删除 [HttpPut] 并直接在浏览器中请求 url 时,它可以工作。使用 [HttpPut] 它不会在浏览器中工作,因为默认情况下 url 会发送可以理解的 [HttpGet]。我想知道这与停止 AngularJS 向服务器发送 $http.put 请求有关。
    • 尝试将其更改为 [HttpPost] 和 $http.post 。看看这是否有所作为
    • 正如我在原始帖子中所写的,$http.post 和 $http.get 工作正常。问题仅出现在 $http.put 和 $http.delete 中。
    猜你喜欢
    • 2013-04-14
    • 2018-01-07
    • 2017-04-05
    • 1970-01-01
    • 2017-01-08
    • 2013-10-15
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多