我无法将用户添加到我的数据库中。运行代码后,我注意到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控制器位于此处
我没有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>
答案 0 :(得分:3)
更新 -
因为你的get方法也获得了404。我猜你的路由错了。发布您的WebApiConfig.cs文件和您的api控制器所在的目录结构。
原始答案 -
这是因为你传入(this)而不是(self),这是你将所有数据绑定到的地方。
改变 -
data: ko.toJSON(this)
到 -
data: ko.toJSON(self)