C# 获得;值不能为空";扩展名为checkboxlist的异常

C# 获得;值不能为空";扩展名为checkboxlist的异常,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我正在从数据库中的引用表中提取一个值列表,并使用CheckBoxListFor在MVC4视图中显示它们。现在,在初始加载、验证和将所选值发布回控制器时,一切都正常工作。我的问题只有在由于某种原因,我的控制器触发了一个验证错误并返回到最初创建文章的视图时才会发生 我的ViewModel: public class DetailsViewModel { public ICollection<GoodsType> GoodsType { get; set; } public

我正在从数据库中的引用表中提取一个值列表,并使用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; }
    }
}
public类详细信息viewmodel
{
公共ICollection GoodsType{get;set;}
公共ICollection SelectedGoodType{get;set;}
公共PostedgoodType PostedgoodType{get;set;}
公共类PostedGoodType
{
公共字符串[]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>
    @Html.CheckBoxListFor(model=>model.postedgoodtype.GoodsTypeIDs, model=>model.GoodsType, entity=>entity.GoodsTypeID, 实体=>entity.goodstypedsc, model=>model.selectedGoodType)
我的控制器:

// 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);
}
//此操作在第一个请求时加载
public ActionResult DeclaredDetails(int?declarationID=null)
{
返回视图(viewModel);
}
//在提交时调用此操作
[HttpPost]
[ValidateAntiForgeryToken]
公共行动结果提交declareDetails(DetailsViewModel viewModel)
{
var errors=新列表();
//验证视图模型
var命令=Mapper.Map(viewModel.Declaration);
错误=_commandBus.Validate(command.ToList();
//将自定义错误添加到modelstate
AddModelErrors(错误);
if(ModelState.IsValid)
{
var result=_commandBus.Submit(命令);
如果(结果、成功)
{
返回重定向到操作(“DeclareVehicle”,viewModel);
}
}
//如果出现问题,请返回页面并显示错误
返回视图(“declaredeails”,viewModel);
}
当我得到一个验证错误并且我的ModelState.IsValid为false时,我想返回到初始视图,传递ViewModel,但我得到以下错误:

值不能为null。 参数名称:源

描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源

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

源错误:

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,
第296行:
第297行:
    第298行:@Html.CheckBoxListFor(model=>model.postedgoodtype.GoodsTypeIDs, 第299行:model=>model.GoodsType, 第300行:entity=>entity.GoodsTypeID,
我尝试在创建ViewModel时初始化对象,但没有成功。有什么想法吗


提前感谢您的帮助!

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

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

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

public SelfDeclareOperatorDetailsViewModel()
{
    GoodsType = new List<GoodsType>();
    SelectedGoodsType = new List<GoodsType>();
    PostedGoodsType = new PostedGoodsType { GoodsTypeIDs = new string[0] };
}
public SelfDeclareOperatorDetailsViewModel()
{
GoodsType=新列表();
SelectedGoodType=新建列表();
PostedgoodType=新PostedgoodType{GoodsTypeIDs=新字符串[0]};
}

再次感谢大家!

CheckBoxListFor的其余部分在哪里?请发布它,哪些操作返回CheckBoxListFor所在的视图?其余部分是什么意思?我正在使用一个扩展,如这里所述:返回CheckBoxListFor的操作是“DeclaredDetails”。您的CheckBoxListFor有一个
,我只看到beggining,我看不到297及以后的标题末尾包含与我在“我的视图:”部分张贴的代码相同的代码。这就是代码。您看到行号的部分是我得到的错误,这就是错误页面中显示的全部内容。