使用CheckBoxListFor Extension获取“值不能为空”异常

时间:2013-06-13 17:16:14

标签: c# asp.net-mvc-4

我从数据库中的引用表中提取值列表,并使用CheckBoxListFor在我的MVC4视图中显示它们。现在,一切正常,初始加载,验证以及将所选值发布回控制器。我的问题只有在出于某种原因,我的控制器触发验证错误并返回到首先发起帖子的视图时才会发生。

我的ViewModel:

public class DetailsViewModel
{
    public ICollection<GoodsType> GoodsType { get; set; }
    public ICollection<GoodsType> SelectedGoodsType { get; set; }
    public PostedGoodsType PostedGoodsType { get; set; }

    public class PostedGoodsType
    {
        public string[] GoodsTypeIDs { get; set; }
    }
}

我的观点:

<ul id="typeOfGoodsCheckBoxList" class="formList botDots twinCols clearfix">
    @Html.CheckBoxListFor(model => model.PostedGoodsType.GoodsTypeIDs,
                                   model => model.GoodsType,
                                   entity => entity.GoodsTypeID,
                                   entity => entity.GoodsTypeDesc,
                                   model => model.SelectedGoodsType)
</ul>

我的控制器:

// This Action is loaded on the first request
public ActionResult DeclareDetails(int? declarationID = null)
{
    return View(viewModel);
}

// This action is called on the submit
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SubmitDeclareDetails(DetailsViewModel viewModel)
{
    var errors = new List<ValidationResult>();
    // Validate ViewModel
    var command = Mapper.Map<Declaration, CreateOrUpdateDeclarationCommand>(viewModel.Declaration);
    errors = _commandBus.Validate(command).ToList();
    // Add the custom errors to the modelstate
    ModelState.AddModelErrors(errors);
    if (ModelState.IsValid)
    {
        var result = _commandBus.Submit(command);
        if (result.Success)
        {
            return RedirectToAction("DeclareVehicle", viewModel);
        }
    }
    // If something went wrong, go back to the page and display the errors
    return View("DeclareDetails", viewModel);
}

当我收到验证错误并且我的ModelState.IsValid为false时,我想返回初始视图,传递ViewModel但是我收到此错误:

值不能为空。 参数名称:source

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ArgumentNullException:值不能为null。 参数名称:source

来源错误:

Line 296:                    </legend>
Line 297:                    <ul id="typeOfGoodsCheckBoxList" class="formList botDots     twinCols clearfix">
Line 298:                        @Html.CheckBoxListFor(model => model.PostedGoodsType.GoodsTypeIDs,
Line 299:                                              model => model.GoodsType,
Line 300:                                              entity => entity.GoodsTypeID,

我在创建ViewModel时尝试初始化对象,但它没有用。有什么想法吗?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

感谢Rikon对OP的评论,我已经设法解决了这个问题。我的问题是我在同一个View中有3个不同的实体(引用表),它们使用CheckBoxListFor,其中2个是互斥的。

因此,每当我回发时,这3个实体中的一个总是为空,所以当我发回它时,该实体为空并抛出上述异常。

解决方案是简单地初始化CheckBoxListFor中使用的对象,即使我不使用它们。这样,它们将始终与模型绑定,并且可以来回传递。

public SelfDeclareOperatorDetailsViewModel()
{
    GoodsType = new List<GoodsType>();
    SelectedGoodsType = new List<GoodsType>();
    PostedGoodsType = new PostedGoodsType { GoodsTypeIDs = new string[0] };
}

再次感谢大家!