我正试图使我的网站上的下拉列表可由该网站的管理员修改.下拉列表上的选项作为IDropDownEntity与关联数据一起存储,例如,JobPriority具有字符串名称和字符串PriorityColor,分支具有字符串名称和AddressValueObject地址,等等.视图上的表单工作正常,但当我将其作为JSON发布到控制器时,关联的数据值没有解析/解析为空.

我使用IDropDownEntity并使用反射和定制属性来确定哪些属性是用户可编辑的,并将结果放入如下所示的DropDownEditViewModel中:

public class DropDownEditViewModel
{
    //constructor()
    public int Id { get; set; }
    public string Name { get; set; }

    public List<DDLEntityEditableProperty> EditableProperties { get; set; } = new();
}

public class DDLEntityEditableProperty
{
    //constructor()
    public string Name { get; set; }
    public object? Value { get; set; }
}

在我的视图中,我有名称和EditableProperties的输入,以及将JSON发送到控制器操作的JQuery,该控制器操作接受DropDownEditViewModel,但在控制器操作上,值总是为空.

//javascript that generates JSON like so in a "var formData":
"Id": "1",
  "Name": "Home Office",
  "ExtraFields": [
    {
      "Name": "PhoneNumber",
      "Value": "111-555-0000",
    },
    {
      "Name": "Address",
      "Value": {
        "Address1": "404 Parse Street",
        "Locality": "Notfound",
        "PostCode": "00404"
      }
    }
  ]
}

//posts to controller using jQuery:
$.post("/DropDowns/EditGenericDropDownEntity", formData, function (result, status) {
    ShowNotification(result.success, result.message);
});

发送到控制器操作

[HttpPost]
public async Task<IActionResult> EditGenericDropDownEntity(DropDownEditViewModel model)
{
    //model's "Value" is always null
    if (!ModelState.IsValid) return Json(new {success = false, text = ModelState.GetError()});
    else return Ok();
}

我曾try 将列表更改为字典、字符串、对象,但得到了相同的问题(键遇到问题,值为空).我还try 将json作为字符串发送到控制器,以使用Newtonsoft进行解析,但也无法正常工作.有没有其他我可以采取的步骤,或者反思不是这个用例的一个选项?

推荐答案

您使用的是表单数据内容类型(默认情况下),但它不能包含任何嵌套对象,它应该是类似于字典、字符串和字符串的类型.try 使用json内容类型,为此需要完整形式的jQuery请求

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "...your url",
    data: JSON.stringify(formData)
    dataType: "json",

    success: function (result) {
       
    },
    error: function (jqXHR, textStatus, errorThrown) {
        console.log(jqXHR, textStatus, errorThrown);
    }
});

并将[FromBody]添加到操作中

public async Task<IActionResult> EditGenericDropDownEntity([FromBody] DropDownEditViewModel model)

Csharp相关问答推荐

为什么使用DXGI输出复制和Direct 3D时捕获的图像数据全为零?

需要深入了解NpgSQL DateTimeOffset处理

应该使用哪一个?"_counter += 1 OR互锁增量(ref_counter)"""

当我使用NET6作为目标框架时,为什么DotNet使用NET8作为MS包?

在C#中使用类中的对象值

.NET 8 Web-API返回空列表

Quartz调度程序不调用作业(job)类

如何在毛伊岛应用程序中完美地同步视图模型和视图的加载?

如何将DotNet Watch与发布配置和传递给应用程序的参数一起使用?

DateTime ToString()未以指定格式打印

如何使用用于VS代码的.NET Maui扩展在我的iOS/Android设备或模拟器上进行调试?

如何允许数组接受多个类型?

我什么时候应该在Dapper中使用Connection.OpenAsync?

ReadOnlyMemory访问基础索引的替代方案

如何使用ODP.NET C#设置Oracle会话时间长度限制

用MongoDB c#驱动程序删除和返回嵌套数组中的文档

毛伊岛.NET 8图片不再适合按钮

正在try 将自定义字体添加到我的控制台应用程序

Linq SELECT的多条指令

如何根据分割文本的块数来计算文本的大小?