【问题标题】:How to properly map array from body returning zero count in asp.net core如何在 asp.net 核心中从返回零计数的主体正确映射数组
【发布时间】:2020-12-23 06:03:52
【问题描述】:

我在 razor 页面中有一个 jquery,用于收集检查的 id 并将它们传递给 asp.net 核心应用程序中的控制器。

jquery 工作正常,但控制器中的计数总是为零。

我在这里尝试了一些示例。我也使用 [frombody] 这甚至击中了控制器

  $('#Delete').click(function () {
            var fav = [];
            $.each($("input[name='ID']:checked"), function () {
                fav.push($(this).val());
            });
            $.ajax({
                type: "post",
                url: "/Loan/Delete",
                dataType: "json",
                data: JSON.stringify(fav),
                success: function (result) {
                }
            })

        });

控制器 在控制器中,id 计数为零

   public void DeleteStatementsRoles(ICollection<Products> ids){}

我想我做错了什么

【问题讨论】:

  • 只发送json时需要设置合适的contentType
  • 我添加了 ``` contentType: "application/json; charset=utf-8",``` 也没有用
  • 哦...您的数据中有favorite,但数组名为fav。确保检查浏览器开发工具控制台中的错误,这会在那里抛出一个
  • 我已经更正了,现在我可以在控制台Array(2) 0: "1" 1: "2" 中获取数组,但仍然无法访问控制器
  • 您能分享一下您的产品型号吗?您是如何设计您的favorite 变量的。

标签: c# jquery arrays asp.net-core razor


【解决方案1】:

这是一个工作演示:

型号:

public class Products
{
    public int Id { get; set; }
}

查看:

<form>
    <input name="ID" type="checkbox" value="1"/>
    <input name="ID" type="checkbox" value="2"/>
   <input type="button" id="Delete" value="delete" />
</form>

@section Scripts
{
    <script>
        $('#Delete').click(function () {
            var fav = [];
            $.each($("input[name='ID']:checked"), function () {
                var obj = {};              //change here...
                obj.Id = $(this).val()
                fav.push(obj);
            });
            $.ajax({
                type: "post",
                url: "/Home/Delete",
                contentType: "application/json",  //add this..
                dataType: "json",
                data: JSON.stringify(fav),
                success: function (result) {
                }
            })

        });
    </script>
}

控制器:

public class HomeController : Controller
{
    [HttpPost]
    public void Delete([FromBody] ICollection<Products> ids) 
    { 
         //do your stuff...
    }
}

结果:

另一种情况:因为我不确定你的模型是什么,这里还有一个工作演示,其中模型包含一个列表。

型号:

public class Products
{
    public List<int> Id { get; set; }
}

查看:

<form>
    <input name="ID" type="checkbox" value="1"/>
    <input name="ID" type="checkbox" value="2"/>
   <input type="button" id="Delete" value="delete" />
</form>

@section Scripts
{
    <script>
        $('#Delete').click(function () {
            var fav = [];
            $.each($("input[name='ID']:checked"), function () {
                fav.push($(this).val());
            });
            var favarite = [];     //add...
            favarite.push({ id: fav });
            
            $.ajax({
                type: "post",
                url: "/Home/Delete",
                contentType: "application/json",   //add this...
                dataType: "json",
                data: JSON.stringify(favarite),
                success: function (result) {
                }
            })

        });
    </script>
}

结果:

【讨论】:

  • 我的模型和第一个例子一样。一旦我输入[FromBody],它就不会击中控制器。如果我删除 [FromBody] 然后点击控制器将归零
  • 确保您已将contentType: "application/json" 添加到您的ajax。
  • 我建议您可以使用 jQuery 共享您的模型和整个剃须刀视图。这将帮助您更快地解决问题。
  • 剃须刀很大,另一件事是我试过IFormCollection,我得到了``` "[{\"Id\":\"1\"},{\"Id\": \"2\"}]" ```也许我最终还是要分享它
  • 我认为您需要将我的整个代码复制到您的项目中。也许您错过了项目中的某些内容。确保在您的 ajax 中添加 contentType: "application/json" 并在您的操作中添加 [FromBody]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2013-12-24
  • 2013-07-29
  • 1970-01-01
相关资源
最近更新 更多