我正在使用Ajax将构成列表的对象的字符串表示传递给C#控制器。当列表已满但为空时,一切工作正常,但模型验证失败。
我传递的字符串是:{"RoutingTags":[]"}
。
用于模型验证的类是这样:
public class RoutingTagsData
{
[Required]
public IList<RoutingTag> RoutingTags { get; set; }
}
该列表使用Ajax传递给控制器,控制器如下所示:
[HttpPost]
public HttpResponseMessage CreateOrUpdateRoutingTags(RoutingTagsData routingTagsData)
{
if (!ModelState.IsValid)
return new HttpResponseMessage(HttpStatusCode.BadRequest);
// stuff
}
但是,模型验证失败,因为routingTagsData
为空。
我该怎么做才能使routingTagsData
成为具有空列表的对象,如果在控制器中为空,则无需自己实例化它?
答案 0 :(得分:1)
是否在控制器中将其实例化为空而不自行实例化?
如果列表为null
是出乎意料的-我肯定会争辩说,所有集合类型都不应该是null
-那么真正的问题是您允许将RoutingTagsData
设为最初处于糟糕的状态。
默认初始化应由类的默认构造函数处理:
public class RoutingTagsData
{
public RoutingTagsData()
{
RoutingTags = new List<RoutingTag>();
}
[Required]
public IList<RoutingTag> RoutingTags { get; set; }
}
解决了这个问题。
答案 1 :(得分:1)
正如@John所说,您可以初始化列表来解决您的问题。而且您没有在控制器内部执行此操作。
public class RoutingTagsData
{
[Required]
public IList<RoutingTag> RoutingTags { get; set; } = new List<RoutingData>( ) ;
}
但是,如果您确定绑定正确完成,并且想要使用null,但验证失败。只需清除Modelstate错误并继续您的逻辑,或者简单地为RoutingTagsData创建一个ModelBinder即可决定要做什么(在ModelState上包含错误,如果列表为空,则不包含),也可以在那里初始化列表在mvc对ModelBinder进行调用之后,但我不建议这样做。
希望这会有所帮助