ASP。 NET控制器接收空数组

时间:2015-11-25 13:53:22

标签: javascript c# asp.net angularjs asp.net-mvc

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

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

我有一个可以接收该模型的控制器:

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

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

在我的Angular.js控制器中,我正在尝试发送此对象:

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

如果同时设置了“DealerDefinedServices”和“DealerDefinedServicesDiscounts”参数,则ASP.NET控制器只接收其中一个,但其他参数变为null。我试图解决这个问题几个小时,最后通过重命名一个提到的参数修复它,因为我认为可能问题是参数有相似的名称。那么,问题是什么,为什么控制器如果有类似的名字就看不到其中一个参数呢?

2 个答案:

答案 0 :(得分:1)

可能是默认模型绑定器中的FormValueProvider混淆了。 它有一个  ContainsPrefix(String) 方法可能是罪魁祸首。 尝试将第二个参数重命名为

  

Dealer1DefinedServicesDiscounts

然后通过命名再次尝试

  

DealerDefinedServices1Discounts

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

此行为的原因

默认模型绑定器使用 FormValueProvider 从请求中提取字段值并将其放入您的经销商模型中。 FormValueProvider 使用 ContainsPrefix 方法在请求中查找$ scope.model对象中的字段。 我的猜测是ContainsPrefix将不正确的信息返回给模型绑定器,因为前缀 DealerDefinedServices 对于模型中的两个属性都是通用的。

我对模型绑定器没有足够的知识来评论代码的执行顺序以及为什么模型绑定器使一个属性为空。

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

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

答案 1 :(得分:0)

这是MVC4中的一个错误。小心。 http://aspnetwebstack.codeplex.com/workitem/616