2

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

我的视图模型:

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 但我收到此错误:

值不能为空。参数名称:来源

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

异常详细信息:System.ArgumentNullException:值不能为空。参数名称:来源

源错误:

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 时尝试初始化对象,但它不起作用。有任何想法吗?

在此先感谢您的帮助!

4

1 回答 1

1

感谢 Rikon 对 OP 的评论,我设法找出了问题所在。我的问题是我在同一个视图中有 3 个使用 CheckBoxListFor 的不同实体(参考表),其中 2 个是互斥的。

因此,每当我回帖时,这 3 个实体之一始终为空,所以当我回帖时,该实体为空并引发上述异常。

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

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

再次感谢大家!

于 2013-06-14T08:42:14.810 回答