如何在 asp.net 核心中从返回零计数的主体正确映射数组

Posted

技术标签:

【中文标题】如何在 asp.net 核心中从返回零计数的主体正确映射数组【英文标题】:How to properly map array from body returning zero count in asp.net core 【发布时间】: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 变量的。 【参考方案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]

以上是关于如何在 asp.net 核心中从返回零计数的主体正确映射数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 asp.net core v 2.0 中从 javascript 调用 PageModel 方法

在 prometheus/grafana 中从零开始绘制一个计数器

如何将我的请求中的安全主体传递到 asp.net MVC 中的线程中

如何在 asp.net 中从 javascript 调用代码隐藏函数?

如何使用角度修改 asp.net 核心 WebAPI 的 asp.net 身份 UI

如何在 c# ASP.net 中从 GridView 行进行单按钮照片上传