asp.net core api PUT 请求从不命中方法
Posted
技术标签:
【中文标题】asp.net core api PUT 请求从不命中方法【英文标题】:asp.net core api PUT request never hits method 【发布时间】:2021-02-15 13:07:18 【问题描述】:我正在尝试在 asp.net 中创建一个 web api。我正在尝试使用 ajax 将我的查询参数发送到操作方法,但它从未到达它。仅供参考,我对 ajax 的经验并不丰富。
我试图在我的视图中使用表单将数据传递给操作方法,但它什么也没做。这是我的看法:
<form action="/api/values" method="put">
<ul>
<li>
<input type="text" id="Id" />
</li>
<li>
<input type="text" id="FirstName" />
</li>
<li>
<button onclick="Update()" class="btn btn-primary">Update</button>
</li>
</ul>
</form>
这是我的 ajax:
<script>
function Update(Id, FirstName)
$.ajax(
url: "/api/values/" + Id + "/" + FirstName,
type: "PUT",
data:
Id: Id,
FirstName: FirstName
,
success: function ()
alert("success");
);
</script>
我的网址看起来像:/api/values?Id=123XXXjxn&FirstName=Billy
这永远不会到达我的控制器:
[HttpPut("Id/FirstName")]
public ActionResult PutRequest([FromQuery] string Id, [FromQuery] string FirstName)
//do stuff
我只使用[HttpPut]
属性进行了尝试,并使用了[Route("Id/FirstName")]
属性,并且在参数中没有[FromQuery]
。我被卡住了,我认为这与我的 ajax 有关,而且我的方法无法读取查询参数,但我不完全确定。
【问题讨论】:
我看不到 api 前缀应该来自哪里(控制器?)和 values 还有为什么这里有查询参数/api/values?Id=123XXXjxn&FirstName=Billy
,这里有路径/api/values/" + Id + "/" + FirstName,
是的,我假设我的 ajax 或我的查询完全错误,我应该如何修复它,也许就像我的 ajax 中的 /api/values?Id=Id&FirstName=FirstName
一样?
每当我填写表格并点击更新时,我的网址都是这样的
它会自动添加?
和&
,但我希望网址为/api/values/123XXXxxx/Billy
【参考方案1】:
你的代码应该是这样的
控制器
[Route("api/values")]
public class ValuesController : Controller
[HttpPut("Id/FirstName")]
public ActionResult PutRequest(string Id, string FirstName)
return new EmptyResult();
查看
<script>
function Update(Id, FirstName)
$.ajax(
url: "/api/values/" + Id + "/" + FirstName,
type: "PUT",
success: function ()
alert("success");
);
</script>
由于你做ajax调用,你不需要表单属性,防止导航到带有event.preventDefault()
的url
<script>
function Update(Id, FirstName)
event.preventDefault();
$.ajax(
url: "/api/values/" + Id + "/" + FirstName,
type: "PUT",
success: function ()
alert("success");
);
</script>
<form>
<ul>
<li>
<input type="text" id="Id" />
</li>
<li>
<input type="text" id="FirstName" />
</li>
<li>
<button type="button" onclick="Update()" class="btn btn-primary">Update</button>
</li>
</ul>
</form>
当然,您还需要一些 jquery 版本。你可以得到最新的here
<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
【讨论】:
这就是我现在拥有的。当我填写我的表格时,我最终得到了这个 URLapi/values?Id=123xxxx&FirstName=namexxxx
,即使我在地址栏中输入 api/values/123kdfj/namexxx
,我最终还是会出现 405 错误。是否有可能因为我的 api 类有一个带有我的 dbcontext 的构造函数,所以我的方法永远无法到达?
为表单添加了修复,因此它无法导航。您无法从地址栏访问此 url,因为浏览器仅从那里发送 GET 请求
构造函数无关紧要,它是依赖注入模式的一部分
我不知道,我正在尝试,我的断点永远不会被击中,并且我的 ajax 和动作由于某种原因永远不会被击中。我将不得不继续努力,但感谢您的帮助。
显示您的控制器和控制台/网络选项卡输出【参考方案2】:
你的控制器代码应该是这样的
[Route("api/values")]
public class ValuesController : Controller
[Route("~/api/values/Id/FirstName")]
public ActionResult PutRequest(string Id, string FirstName)
.......
Your url shood look like: /api/values/123XXXjxn/Billy
更改 javascript
type: "PUT",
data:
Id: Id,
FirstName: FirstName
,
到
type: "POST",
data: null,
并检查你是否有 app.UseRouting();在启动文件的配置部分。
【讨论】:
是的,当我填写表格并点击更新时,我的网址是?Id=123xxxjxn?FirstName=Billy
,我该如何更正?
[FromQuery]
表示应该使用请求查询字符串来绑定参数,而不是路径参数。
我做了所有这些,我什至在我的地址栏中输入了 url /api/values/123xxxxxx/Billy
并收到了 405 错误。我不知道如何让 ajax 自动生成这个 url 而不是 ?
和 &
的 url
从您的控制器操作中删除 [PUT] 并尝试在您的 ajax 中更改为 [POST]以上是关于asp.net core api PUT 请求从不命中方法的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ASP.NET MVC 到 ASP.NET Core Web API 的 PUT?
PUT 请求抛出 403 CORS 错误 Asp.Net Core 3.1 + Vue3 +IIS10
如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?
MediatR CQRS - 如何处理不存在的资源(asp.net core web api)
使用具有多个来源的 PUT 和 DELETE 请求时如何解决 ASP.NET Web API CORS Preflight 问题?