【发布时间】:2020-05-26 14:52:05
【问题描述】:
我想通过 AJAX 将请求发布到带有模型前缀的控制器。我需要一个前缀,因为我在一个页面上有两个具有类似模型属性的表单(“asp-for”正在生成类似的 ID 和名称)。我正在使用 .NET Core 3.1。
请求帖子无需前缀即可正常工作。当我使用下面示例中的前缀时,控制器中传递的模型为空:
带前缀的控制器
[HttpPost]
public async Task<IActionResult> Save([Bind(Prefix="ShipmentAddress"), FromBody]ShipToAddressViewModel model)
{
// model is null
...
return PartialView(ShipmentAdressFormView, model);
}
带前缀查看
在我的视图中,我也设置了 HTMLFieldPrefix:
@model ShipToAddressViewModel
@{
ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "ShipmentAddress";
}
...
$("body").on('submit','#formShipmentAddress', function (e) {
// Getting the data (see passed JSON below)
var formData = new FormData(<HTMLFormElement>document.getElementById('formShipmentAddress'));
var object = {};
formData.forEach(function (value, key) {
object[key] = value;
});
var data = object;
$.ajax({
type: "POST",
url: url,
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
success: (data) => {
success(data);
}
});
});
传递带有前缀的 JSON 负载
{"ShipmentAddress.ID":"3","ShipmentAddress.Name":"Eddard Stark","ShipmentAddress.Name2":"c/o Ned",..."}
型号
public class ShipToAddressViewModel
{
public int ID { get; set; }
[Display(Name="Name")]
public string Name { get; set; }
[Display(Name = "Name 2")]
public string Name2 { get; set; }
...
}
更新
如果我从对象的键中删除前缀,那么它就可以工作,尽管更像是一种变通方法(模型绑定首先查看键 ShipmentAddress.ID 的源。如果找不到,它会寻找没有前缀的ID。):
// Getting the data (see passed JSON below)
var formData = new FormData(<HTMLFormElement>document.getElementById('formShipmentAddress'));
var object = {};
formData.forEach(function (value, key) {
object[key.replace("ShipmentAddress.","")] = value;
});
var data = object;
【问题讨论】:
-
艾德·史塔克 :'(
-
我通过遍历表单数据来获取数据,当我将前缀替换为“nothing”时,即使在您的示例中也可以使用。数据类型没有影响,.NET 无论如何都可以解析它。
标签: javascript c# json .net-core asp.net-core-mvc