模型验证在空白列表上失败

时间:2019-05-06 09:43:40

标签: c# asp.net ajax

我正在使用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成为具有空列表的对象,如果在控制器中为空,则无需自己实例化它?

2 个答案:

答案 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进行调用之后,但我不建议这样做。

希望这会有所帮助