ASP.NET核心MVC-Ajax Post请求400错误

ASP.NET核心MVC-Ajax Post请求400错误,ajax,asp.net-core,asp.net-core-mvc,http-post,asp.net-ajax,Ajax,Asp.net Core,Asp.net Core Mvc,Http Post,Asp.net Ajax,在ajax中,如果我写入:data:JSON.stringify(cat)我得到这个错误:JSON值无法转换为System.Collections.Generic.IEnumerable,如果我写入:data:cat我得到这个错误:'I'是一个无效的值开头。路径:$|行号:0 | BytePositionLine:0。所以,我想我在json上做了一些错误的事情,但是什么呢 以下是类别的相关类别: Area.Identity.Data.Category: public class Category

在ajax中,如果我写入:
data:JSON.stringify(cat)
我得到这个错误:
JSON值无法转换为System.Collections.Generic.IEnumerable
,如果我写入:
data:cat
我得到这个错误:
'I'是一个无效的值开头。路径:$|行号:0 | BytePositionLine:0。
所以,我想我在json上做了一些错误的事情,但是什么呢

以下是类别的相关类别:

Area.Identity.Data.Category:

public class Category
    {
        //----------------------------------------------------
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        //----------------------------------------------------
        public string Name { get; set; }
 
        //----------------------------------------------------
        public ICollection<Post> Posts { get; set; }

        public Category(string name)
        {
            Name = name;
        }
    }
 public class Category
    {
        public int Id { get; set; }
        public string Name { get; set; }
 
        public Category(int id, string name)
        {
            Id = id;
            Name = name;
        }

    }
CategoryMapper.cs:

 public class CategoryMapper
    {
        public static Models.Category FromDatabase(Areas.Identity.Data.Category cat)
        {
            return new Models.Category
            (
                cat.Id,
                cat.Name
            );
            
        }
        
        public static Areas.Identity.Data.Category ToDatabase(Models.Category cat)
        {
            return new Areas.Identity.Data.Category
            (
                //id is database generated
                cat.Name
            );
        }
    }
CategoryRepository.cs:

public class CategoryRepository
    {
        private readonly MyContext _context;

        public CategoryRepository(MyContext context)
        {
            _context = context;
        }

        public IEnumerable<Models.Category> GetAll()
        {
            return _context.Category.Select(x => CategoryMapper.FromDatabase(x));
        }

        public void Save(Models.Category category)
        {
            _context.Category.Add(CategoryMapper.ToDatabase(category));
            _context.SaveChanges();
        }
    }

CategoryApicController.cs:

 public class CategoryController : Controller
    {
        
        // GET: Category
        public ActionResult Index()
        {
            return View();
        }

        // GET: Category/Details/5
        public ActionResult Details(int id)
        {
            ViewBag.ID = id;
            return View();
        }

        // GET: Category/Create
        public ActionResult Create()
        {
            return View();
        }

        // POST: Category/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(IFormCollection collection)
        {
            return View();
           
        }
   }

    [Route("api/category")]
    [ApiController]
    public class CategoryApiController : ControllerBase
    {
        private CategoryService _catService;

        public CategoryApiController(CategoryService catService)
        {
            _catService = catService;
        }


        [HttpGet]
        public ActionResult<List<Models.Category>> Get()
        {
            return _catService.GetAll().ToList();
        }

        [HttpGet("{id}")] // api/category/0
        public ActionResult<Models.Category> Get(int id)
        {
            return _catService.GetAll().ToList().Find(x => x.Id == id);
        }

        [HttpPost]
        //[Route("/api/category/save")]
        public IActionResult Save([FromBody] JObject json)
        {
            Models.Category c= CategoryDto.FromJson(json);
            _catService.Save(c);
            return Ok();
        }
    }
[路线(“api/类别”)]
[ApiController]
公共类类别控件:ControllerBase
{
私人分类服务;
公共类别API控制器(类别服务catService)
{
_catService=catService;
}
[HttpGet]
公共行动结果获取()
{
return _catService.GetAll().ToList();
}
[HttpGet(“{id}”)]//api/category/0
公共操作结果获取(int-id)
{
返回_catService.GetAll().ToList().Find(x=>x.Id==Id);
}
[HttpPost]
//[路由(“/api/category/save”)]
公共IActionResult保存([FromBody]JObject json)
{
Models.Category c=CategoryDto.FromJson(json);
_catService.Save(c);
返回Ok();
}
}
CategoryDto.cs:

 public static class CategoryDto
    {
        public static Models.Category FromJson(JObject json)
        {
            var id = json["id"].ToObject<int>();
            var name = json["name"].ToObject<string>();

            return new Models.Category(id, name);
        }
    }
公共静态类CategoryTo
{
公共静态模型.Category FromJson(JObject json)
{
var id=json[“id”].ToObject();
var name=json[“name”].ToObject();
返回新模型。类别(id、名称);
}
}
Create.cshtml:

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions{
    public string GetAntiXsrfRequestToken()
    {
        return Xsrf.GetAndStoreTokens(Context).RequestToken;
    }
}

<h2>Create New Category </h2>

<table id="table">
    <thead id="table-head"></thead>
    <tbody id="table-body"></tbody>
</table>


<form class="AddCategory">
    <div class="form-group">
        <div class="form-group">
            <input required="" id="cat_input" class="form-control" />
            <span class="text-danger"></span>
        </div><!-- .form-group -->
        <div class="form-group">
            <label>Input category name:</label>
            <input type="button" value="Add new category value" class="btn btn-primary addCategory" />
        </div><!-- .form-group -->
    </div><!-- .form-group -->
</form>


<script type="text/javascript">

    'use strict';

    function createRow(JsonObj) {
        let row = document.createElement('tr');

        let cellId = document.createElement('td');
        cellId.innerHTML = JsonObj.id;

        let cellName = document.createElement('td');
        cellName.innerHTML = JsonObj.name;

        row.appendChild(cellId);
        row.appendChild(cellName);

        return row;
    }

    function createHeader(JsonObj) {
        let keys = Object.keys(JsonObj);
        let row = document.createElement('tr');
        for (let i = 0; i < keys.length; i++) {
            const item = keys[i];
            var cell = document.createElement('th');
            cell.innerHTML = item;
            row.appendChild(cell);
        }


        return row;
    }

    async function getAll() {
        return await axios.get('/api/category');
    }

    function afterGetAll(response) {
        console.log(response.data);
        document.getElementById('table-head').appendChild(createHeader(response.data[0]));
        for (let i = 0; i < response.data.length; i++) {
            const item = response.data[i];
            document.getElementById('table-body').appendChild(createRow(item));
        }

        //Add New Category
        $('.addCategory').on('click', function () {
            var cat_input = $('#cat_input').val();
            var _id = parseInt(response.data.length + 1);
            var cat = { id: _id, name: cat_input };
            console.log(cat);
            $.ajax({
                type: 'POST',
                contentType: 'application/json; charset=utf-8',
                url: '/api/category',
                dataType: 'json',
                data: JSON.stringify(cat),
                /*beforeSend: function (xhr) {
                    xhr.setRequestHeader("XSRF-TOKEN",
                        $('input:hidden[name="__RequestVerificationToken"]').val());
                },*/
                 headers: {
                        "RequestVerificationToken": '@GetAntiXsrfRequestToken()'
                    },
                success: function () {
                        console.log('ok');
                    },
                error: function () {
                        console.log('not ok');
                    }
                });
        });

    }

    $(document).ready(function () {

        getAll().then(response => afterGetAll(response));

    });

</script>
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@功能{
公共字符串GetAntiXsrfRequestToken()
{
返回Xsrf.GetAndStoreTokens(Context.RequestToken);
}
}
创建新类别
输入类别名称:
"严格使用",;
函数createRow(JsonObj){
让row=document.createElement('tr');
让cellId=document.createElement('td');
cellId.innerHTML=JsonObj.id;
让cellName=document.createElement('td');
cellName.innerHTML=JsonObj.name;
第2行:附加子(cellId);
行。appendChild(cellName);
返回行;
}
函数createHeader(JsonObj){
让keys=Object.keys(JsonObj);
让row=document.createElement('tr');
for(设i=0;iafterGetAll(response));
});

JObject
适用于早期版本的ASP.NET Core 3,如果您想在3.0或更高版本中使用它,您必须下载该软件包:

Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.1.6
在Startup.cs中启用它

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers().AddNewtonsoftJson();
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers().AddNewtonsoftJson();
}