gpt4 book ai didi

javascript - ASP。 NET Controller 接收空数组

转载 作者:行者123 更新时间:2023-12-03 08:16:25 26 4
gpt4 key购买 nike

我正在编写 Angular.js/ASP.NET 应用程序。我定义了这个模型:

public class Dealer : EntityBase
{
...
public virtual List<DealerDefinedService> DealerDefinedServices { get; set; }
public virtual List<DealerDefinedServicesDiscount> DealerDefinedServicesDiscounts { get; set; }
...
}

我有一个可以接收该模型的 Controller :

[HttpPost]
public ActionResult Edit(Dealer model)
{
if (ModelState.IsValid)
{
dealerService.EditDealer(model);

return RedirectToAction("Index");
}
return View("Create", model);
}

在我的 Angular.js Controller 中,我尝试发送此对象:

{
"DealerDefinedServices": [
{
...
}
],
"DealerDefinedServicesDiscounts": [
{
...
}
]
}

如果同时设置了“DealerDefinedServices”和“DealerDefinedServicesDiscounts”参数,则 ASP.NET Controller 仅接收其中之一,而其他参数将为空。我花了几个小时试图解决这个问题,最后通过重命名提到的参数之一来解决它,因为我认为问题可能在于参数具有相似的名称。那么,问题是什么,为什么 Controller 看不到具有相似名称的参数之一?

最佳答案

这可能是默认模型绑定(bind)器中的 FormValueProvider 感到困惑。它有一个 包含前缀(字符串)方法可能是罪魁祸首。尝试将第二个参数重命名为

Dealer1DefinedServicesDiscounts

然后通过命名再次尝试

DealerDefinedServices1Discounts

前者应该正常工作,而后者应该重现空问题。

此行为的原因

默认模型绑定(bind)器使用 FormValueProvider 从请求中提取字段值并将其放入您的 Dealer 模型中。FormValueProvider 使用 ContainsPrefix 方法来查找请求中的字段(在本例中为 $scope.model 对象)。我的猜测是 ContainsPrefix 向模型绑定(bind)器返回了不正确的信息,因为前缀 DealerDefinedServices 对于模型中的两个属性来说很常见。

我对模型绑定(bind)器没有足够的了解,无法评论代码的执行顺序以及模型绑定(bind)器为何使一个属性为空。

由于您已经尝试过更改属性名称,使它们不具有相同的前缀,因此可以解决此问题。

要尝试的另一件事可能是使用 WebAPI 而不是 MVC 中的操作方法。 Action 方法的模型绑定(bind)器期望接收表单对象(因此名称为 FormValueProvider)。由于您传递的本质上是一个 json/javascript 对象,因此 WebAPI 模型绑定(bind)器在绑定(bind)它方面可能会更有效。注意:我没有尝试过,它的WebAPI可能有同样的问题。

关于javascript - ASP。 NET Controller 接收空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33918289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com