PUT Ajax请求返回404未找到asp.net MVC
PUT Ajax请求返回404未找到asp.net MVC
我对asp.net MVC还不熟悉,我正在制作一个类似于Stack Overflow的项目。在这个项目中,我只想使用ajax系统来对答案进行点赞或踩。这样,我就可以在不刷新页面的情况下显示计数器的增加和减少。
我已经使用默认的scaffolding创建了一个名为Question
的控制器,并在其中定义了一个QuestionDetails
方法,该方法负责返回QuestionDetailsView
视图。在这个视图中,当用户点击点赞或踩时,我会向我的API
控制器VotesController
发送ajax请求。
但是我遇到了这个错误
jquery-3.3.1.js:9600 PUT https://localhost:44389/Question/QuestionDetails/api/votes/3 404 not found send @ jquery-3.3.1.js:9600 ajax @ jquery-3.3.1.js:9206 (anonymous) @ 2:230 dispatch @ jquery-3.3.1.js:5183 elemData.handle @ jquery-3.3.1.js:4991
这是我的第一个默认scaffolding控制器Question
的代码:
public ActionResult QuestionDetails(int Id) { QuestionDetailViewModel questionDetailViewModel = new QuestionDetailViewModel { Question = QBL.GetQuestions(Id), UserId = User.Identity.GetUserId(), QuestionId = Id, }; return View(questionDetailViewModel); } [HttpPost] [ValidateInput(false)] public ActionResult QuestionDetails(QuestionDetailViewModel questionDetailViewModel) { QBL.CreateAnswer(questionDetailViewModel); return RedirectToAction("QuestionDetails", new { Id = questionDetailViewModel.QuestionId }); }
视图代码如下:
@model AskMe.Models.ViewModel.QuestionDetailViewModel
@{
ViewBag.Title = "QuestionDetails";
}
Question Details:
@Model.Question.Post.Title
@Html.Raw(Model.Question.Post.Content)
Answers:
@foreach (var answer in Model.Question.Answers)
{
Answered by: @answer.Post.CreatedBy.UserName
@Html.Raw(answer.Post.Content)
}
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
Contribute your answer:
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.LabelFor(m => m.AnswerContent, new { @class = "col-md-2 control-label" })
@Html.TextAreaFor(m => m.AnswerContent, new { @class = "form-control" })
@Html.HiddenFor(m => m.UserId)
@Html.HiddenFor(m => m.QuestionId)
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval");
$(document).ready(function () {
tinyMCE.init({
mode: "textareas",
});
$("#vote").on("click",".thumbs-up", function () {
console.log("in selection func");
$.ajax({
url: "api/vote/" + $(this).attr("data-vote-id"),
method: "PUT",
success: function () {
console.log("success");
}
})
})
});
}
这是我的votes
API
控制器代码:
using AskMe.Models; using Microsoft.AspNet.Identity; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; namespace AskMe.API { public class VotesController : ApiController { ApplicationDbContext _context = new ApplicationDbContext(); [HttpPut] public IHttpActionResult UpVote(int postId) { var userId = User.Identity.GetUserId(); var user = _context.Users.Find(userId); var post = _context.Posts.Find(postId); var votes = post.Votes.ToList(); if (votes.FindAll(u => u.UserId == userId).Count == 0) { Votes vote = new Votes { VotedDateTime = DateTime.Now, UserId = userId, User = user, Post = post, PostId = postId, }; post.Votes.Add(vote); _context.SaveChanges(); return Ok(); } return BadRequest(); } } }
我不确定我的API链接是应该这样https://localhost:44389/Question/QuestionDetails/api/votes/3
还是https://localhost:44389/api/votes/3
,而我的路由配置是这样的:
routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
PUT Ajax请求返回404未找到的问题是由于请求的路径不正确导致的。当请求'UpVote'动作时,它会查找"basepath(localhost)/controller/action/Api/etc."路径,但该路径并不存在。因此,我们需要创建正确的请求路径https://localhost:44389/API/Votes/UpVote/3
。
解决方法:
1. 确保请求的路径是正确的,包括主机名、端口号、控制器名称和动作名称等。
2. 检查API路由配置是否正确,确保路径与控制器和动作名称匹配。
3. 确保控制器中存在对应的动作方法,并且该方法具有正确的参数和返回类型。
4. 确保请求的方式是PUT方法,如果不是,可以尝试更改为PUT方法进行请求。
5. 检查服务器端是否存在相关的资源或数据,如果不存在,可以根据需要进行创建或者修改。
通过以上方法,我们可以解决PUT Ajax请求返回404未找到的问题,并确保请求能够正确地返回所需的数据。
PUT Ajax请求返回404 not found asp.net MVC问题的原因可能是Ajax请求中的URL不正确,解决方法是检查URL并确保其与路由配置匹配。
根据提供的信息,可以推断出以下原因和解决方法:
1. 原因:Ajax请求中的URL可能不正确。
解决方法:确保在Ajax调用中包含动作/方法名称,并根据路由配置设置正确的URL。
url: "api/vote/upvote/" + $(this).attr("data-vote-id")
2. 原因:路由配置不正确。
解决方法:检查路由配置,确保其与所需的URL匹配。
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } );
3. 原因:使用的是MVC5与WebApi。
解决方法:在MVC5中使用WebApi时需要注意。请参考此链接以获取更多信息:[链接](https://stackoverflow.com/questions/26067296)
4. 原因:控制器名称可能是"votes"。
解决方法:确认控制器名称是否为"votes",如果是,则在URL中使用正确的控制器名称。
url: "api/votes/upvote/" + $(this).attr("data-vote-id")
如果出现PUT Ajax请求返回404 not found asp.net MVC的问题,可能是URL不正确或路由配置有误。要解决此问题,需要检查并确保URL正确,并根据需要更新路由配置。