永远不会在ApiController中调用Post方法

时间:2014-03-09 17:58:41

标签: javascript html ajax asp.net-mvc-4

我无法将用户添加到我的数据库中。运行代码后,我注意到ApiController中的Post方法永远不会被调用。

这是我的控制器:ChatUserController

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using SignalRChat.Models;

namespace SignalRChat.Controllers
{
    public class ChatUserController : ApiController
    {
        // GET api/chatuser
        public IEnumerable<ChatRoomUser> Get()
        {
            var user = UserRepository.GetChatRoomUsers();
            return user.ToList();
        }

        // GET api/chatuser/5
        public ChatRoomUser Get(int id)
        {
            return UserRepository.GetChatRoomUsers().FirstOrDefault(u => u.UserId == id);
        }

        public HttpResponseMessage Post(ChatRoomUser user)
        {
            UserRepository.AddUser(user);
            var response = Request.CreateResponse(HttpStatusCode.Created, user);
            var uri = Url.Link("DefaultApi", new { id = user.UserId });
            response.Headers.Location = new Uri(uri);
            return response;
        }

        // PUT api/chatuser/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/chatuser/5
        public void Delete(int id)
        {
        }
    }
}

这是我的javascript文件,位于Project根目录下的文件夹中: UserViewModel.js

/// <reference path="../Scripts/jquery-1.10.2.min.js" />
/// <reference path="../Scripts/knockout-3.1.0.js" />

$(document).ready(function () {
    ko.applyBindings(new user(), document.getElementById('createNode'));
});

function user(username,roomid,roomname) {
    var self = this;
    self.UserName = username;
    self.RoomId = roomid;
    self.RoomName = roomname;

    self.addUser = function() {
        $.ajax({
            url: "/api/chatuser/",
            type: "post",
            data: ko.toJSON(this),
            contentType: 'application/json',
            success: function(result) {

            }
        });
    };
}

以下是我的观点:Users.cshtml

@{
    ViewBag.Title = "Users";
}

<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/knockout-3.1.0.js"></script>
<script src="~/MyJS/UserViewModel.js"></script>

<h2>Users</h2>

<div id="createNode">@Html.Partial("CreateUser")</div>

这是我的部分视图:CreateUser.cshtml

<table>
    <tr>
        <th>UserName</th>
        <td> <input type="text" data-bind="user: UserName"/></td>

        <th>RoomId</th>
        <td> <input type="number" data-bind="user: RoomId" /></td>

        <th>RoomName</th>
        <td> <input type="text" data-bind="user: RoomName" /></td>
    </tr>


</table>
<br/>
<input type="button" id="btnAddUser" value="Add User" data-bind="click: addUser" />

我一直试图解决这个问题,但我觉得它与javascript文件有关,因为这是应该调用Post方法的地方。正确?

非常感谢所有帮助。

编辑:

我的WebAPI控制器位于此处

enter image description here

我没有WebAPI.config文件,但我有一个web.config文件?所以听起来像是一个问题?

以下是我的图片中选择的Web.config文件:

<?xml version="1.0"?>

<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    </sectionGroup>
  </configSections>

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="SignalRChat" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

  <appSettings>
    <add key="webpages:Enabled" value="false" />
  </appSettings>

  <system.webServer>
    <handlers>
      <remove name="BlockViewHandler"/>
      <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
    </handlers>
  </system.webServer>
</configuration>

1 个答案:

答案 0 :(得分:3)

更新 -

因为你的get方法也获得了404。我猜你的路由错了。发布您的WebApiConfig.cs文件和您的api控制器所在的目录结构。

原始答案 -

这是因为你传入(this)而不是(self),这是你将所有数据绑定到的地方。

改变 -

data: ko.toJSON(this)

到 -

data: ko.toJSON(self)