[英]PUT Ajax request returning 404 not found asp.net MVC
我是 asp.net MVC 的新手,我正在制作一個項目,就像堆棧溢出一樣。 在此,我只想使用 ajax 系統來支持或反對答案。 所以,我可以在不刷新頁面的情況下顯示計數器的增加和減少。 I have default scaffolding one controller of Question
in the controller
and in which I have QuitionDetails
method which is responsible for the QuitionDetailsView
and in this view I am making ajax request to my API
controller VotesController
when the user clicks on the up-vote or down-投票。 但我收到了這個錯誤
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
這是我的第一個默認腳手架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";
}
<h1>Question Details: </h1>
<h3>@Model.Question.Post.Title</h3>
@Html.Raw(Model.Question.Post.Content)
<hr />
<h3>Answers:</h3>
@foreach (var answer in Model.Question.Answers)
{
<div class="card bg-light m-1">
<div class="card-body">
<h5 class="card-title">Answered by: @answer.Post.CreatedBy.UserName</h5>
@Html.Raw(answer.Post.Content)
</div>
<div id="vote" class="col">
<div>
<button data-vote-id="@answer.Post.PostId" class="nav-link thumbs-up" href=""><i class="fa fa-thumbs-up" aria-hidden="true"></i></button>
</div>
<div>
</div>
<div>
<button data-vote-id="@answer.Post.PostId" class="nav-link thumbs-down" href=""><i class="fa fa-thumbs-down" aria-hidden="true"></i></button>
</div>
</div>
</div>
}
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h3>Contribute your answer: </h3>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(m => m.AnswerContent, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextAreaFor(m => m.AnswerContent, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
@Html.HiddenFor(m => m.UserId)
@Html.HiddenFor(m => m.QuestionId)
<input type="submit" value="Contribute now" class="btn btn-outline-primary" />
</div>
</div>
</div>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval");
<script type="text/javascript">
$(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");
}
})
})
});
</script>
}
這是我的votes
API
controller 代碼
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();
}
}
}
I am not sure my api link should be like this https://localhost:44389/Question/QuestionDetails/api/votes/3
or https://localhost:44389/api/votes/3
and my route config is routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
如果您沒有更改標准路由,則需要在 ajax 調用中包含操作/方法名稱。
嘗試:
url: "api/vote/upvote/" + $(this).attr("data-vote-id")
您的路線配置應如下所示:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
如果您將 MVC5 與 WebApi 一起使用,這是我的猜測,您必須小心。 有關如何執行此操作的更多信息,請參閱此帖子。
實際上你的錯誤告訴了一切。 當您請求“UpVote”操作時,它正在查看“basepath(localhost)/controller/action/Api/etc”。 它不會退出。 您必須為https://localhost:44389/API/Votes/UpVote/3
創建請求
If you want to call controller action from ajax, you have to mention the controller name and action method in url section of ajax call.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.