我从数据库中的引用表中提取值列表,并使用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时尝试初始化对象,但它没有用。有什么想法吗?
提前感谢您的帮助!
答案 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] };
}
再次感谢大家!