【问题标题】:asp.net core api PUT request never hits methodasp.net core api PUT 请求从不命中方法
【发布时间】: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&amp;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&amp;FirstName=Billy,这里有路径/api/values/" + Id + "/" + FirstName,
  • 是的,我假设我的 ajax 或我的查询完全错误,我应该如何修复它,也许就像我的 ajax 中的 /api/values?Id={Id}&amp;FirstName={FirstName} 一样?
  • 每当我填写表格并点击更新时,我的网址都是这样的
  • 它会自动添加?&amp;,但我希望网址为/api/values/123XXXxxx/Billy

标签: c# asp.net ajax asp.net-web-api put


【解决方案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>

【讨论】:

  • 这就是我现在拥有的。当我填写我的表格时,我最终得到了这个 URL api/values?Id=123xxxx&amp;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 而不是 ?&amp; 的 url
  • 从您的控制器操作中删除 [PUT] 并尝试在您的 ajax 中更改为 [POST]
猜你喜欢
  • 2017-04-24
  • 2021-11-18
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 2019-08-03
  • 2022-01-02
相关资源
最近更新 更多