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 を渡して最初のビューに戻りたいのですが、次のエラーが発生します。

値を 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,

ViewModel の作成時にオブジェクトの初期化を試みましたが、うまくいきませんでした。何か案は?

よろしくお願いします。

4

1 に答える 1

1

OPに関するRikonのコメントのおかげで、私は問題を理解することができました. 私の問題は、CheckBoxListFor を使用する同じビューに 3 つの異なるエンティティ (参照テ​​ーブル) があり、そのうちの 2 つが相互に排他的であることです。

したがって、ポストバックするたびに、これらの 3 つのエンティティのいずれかが常に null であったため、ポストバックすると、そのエンティティは null であり、上記の例外がスローされました。

解決策は、使用しない場合でも、CheckBoxListFor で使用されるオブジェクトを単純に初期化することでした。このようにして、それらは常にモデルにバインドされ、前後に渡すことができます。

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

みんなありがとう!

于 2013-06-14T08:42:14.810 に答える