[英]ASP.NET Core 3.1 | Argument model always null with large form data in controller action method
[英]ASP.Net Core 3.1: Controller method always recieves NULL parameter from HttpPost call
我使用 ASP.Net Core 3.1 和 MVC 模式創建了一個全新的 Visual Studio 2019 Web 應用程序。
我的控制器有一個 HttpPost 方法,它應該有一個傳入的 Json 對象(我使用 [FromBody] 作為傳入參數)。
無論我嘗試什么,傳入的參數始終為 Null。 我嘗試將參數更改為字符串,並將模型修改為簡單的 3 字段類,但它仍然以空值形式出現。
我使用 Chrome 的開發人員工具來確保我的頁面從 JavaScript Post 回調正確發送 Json 對象(並且還使用 Postman 執行相同的操作)並得到相同的結果:我的參數仍然為 Null。
我需要做什么才能讓參數作為實際值出現?
我的控制器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using canvasApiLib.API;
using CanvasGrades.Models.AuxiliaryModels;
namespace CanvasGrades.Controllers
{
public class FinalGradeController : Controller
{
public async Task<IActionResult> Index()
{
// Course Name
dynamic courseDetails = await clsCoursesApi.getCourseDetails(accessToken, apiUrl, canvasCourseId);
ViewData["CourseName"] = courseDetails.name;
// Course Term
dynamic courseTerm = await clsEnrollmentTermsApi.getEnrollmentTerm(accessToken, apiUrl, canvasAccountID, termNum);
ViewData["CourseTerm"] = courseTerm.name;
return View();
}
[HttpPost]
public async Task<IActionResult> LoadTable([FromBody]DTParameters dtParameters)
{
//DTParameters dtParameters = new DTParameters();
if (dtParameters == null)
{
dtParameters = new DTParameters();
}
}
}
}
我的 DTParameters 模型:
public class DTParameters
{
public int Draw { get; set; }
public DTColumn[] Columns { get; set; }
public DTOrder[] Order { get; set; }
public int Start { get; set; }
public int Length { get; set; }
public DTSearch Search { get; set; }
public IEnumerable<string> AdditionalValues { get; set; }
}
我看到的大多數示例都說明在 Startup.cs 文件的配置調用中調整 app.UseMVC 實例化,但我的沒有:
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDistributedMemoryCache();
services.AddControllersWithViews();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
(添加)
{"draw":1,"columns":[{"data":"studentName","name":"","searchable":true,"orderable":true,"search":{"value":"","regex":false}},{"data":"studentEMail","name":"","searchable":true,"orderable":true,"search":{"value":"","regex":false}},{"data":null,"name":"","searchable":true,"orderable":true,"search":{"value":"","regex":false}},{"data":"finalGrade","name":"","searchable":true,"orderable":true,"search":{"value":"","regex":false}},{"data":"lastAttendDate","name":"","searchable":true,"orderable":true,"search":{"value":"","regex":false}},{"data":null,"name":"","searchable":true,"orderable":true,"search":{"value":"","regex":false}},{"data":null,"name":"","searchable":true,"orderable":true,"search":{"value":"","regex":false}},{"data":"bannerID","name":"","searchable":true,"orderable":true,"search":{"value":"","regex":false}},{"data":"crn","name":"","searchable":true,"orderable":true,"search":{"value":"","regex":false}}],"order":[{"column":0,"dir":"asc"}],"start":0,"length":10,"search":{"value":"","regex":false}}
我再次重試了我的簡單參數,注意到我發送的原始 ID 字段是一個整數,但是當我將它設為字符串(如模型所述)時,它沒有問題。
public class SimpleParam
{
public string Id { get; set; }
public string Name { get; set; }
public string Foo { get; set; }
}
{"id": "1", "name": "fred", "foo": "bob"}
所以,這意味着我將不得不弄清楚我的 DTParameters 模型有什么問題。
錯誤是“dir”:“asc”。 您需要將其更改為 int ("dir": 0),或者用
[JsonConverter(typeof(JsonStringEnumConverter))]
或者把它放在 startup.cs
public void ConfigureServices(IServiceCollection services)
{
services
.AddControllers()
.AddJsonOptions(options =>
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter())
);
//...
}
您的輸入美化了:
{
"draw": 1,
"columns": [
{
"data": "studentName",
"name": "",
"searchable": true,
"orderable": true,
"search": {
"value": "",
"regex": false
}
}
],
"order": [
{
"column": 0,
"dir": "asc"
}
],
"start": 0,
"length": 10,
"search": {
"value": "",
"regex": false
}
}
您的 Datatables 類具有正確的裝飾(見上文 DTOrderDir):
public class DTParameters
{
public int Draw { get; set; }
public DTColumn[] Columns { get; set; }
public DTOrder[] Order { get; set; }
public int Start { get; set; }
public int Length { get; set; }
public DTSearch Search { get; set; }
public IEnumerable<string> AdditionalValues { get; set; }
}
public class DTColumn
{
public string Data { get; set; }
public string Name { get; set; }
public bool Searchable { get; set; }
public bool Orderable { get; set; }
public DTSearch Search { get; set; }
}
public class DTOrder
{
public int Column { get; set; }
public DTOrderDir Dir { get; set; }
}
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum DTOrderDir
{
ASC,
DESC
}
public class DTSearch
{
public string Value { get; set; }
public bool Regex { get; set; }
}
閱讀此處了解更多信息: JavaScriptSerializer - 枚舉作為字符串的 JSON 序列化
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.