ASP.NET核心MVC-Ajax Post请求400错误
在ajax中,如果我写入: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
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();
}