1

テキスト ボックス (および特定のケースでレンダリングしたいモデル エディター) を備えた単純なフォームがあります。

@using (Html.BeginForm("Import", "Flow"))
{
    @Html.TextBoxFor(model => model.IsConfirmed)

    @if (Model.IsConfirmed)
    {
        @Html.EditorFor(m => m.Preview)
    }
}

このビューで使用されるモデルは次のとおりです。

public class ImportViewModel
{
    public Boolean IsConfirmed { get; set; }

    public PreviewViewModel Preview { get; set; }

    public ImportViewModel()
    {
        this.IsConfirmed = false;
    }
}

フォームは次のコントローラーに投稿します

public class FlowController
{
    [HttpPost]
    public ActionResult Import(ImportViewModel model)
    {
        try
        {
            if (ModelState.IsValid)
            {
                if (model.IsConfirmed)
                {
                    // do something else
                }
                else
                {
                    model.Preview = Preview(model.strCA, model.SelectedAccount);
                    model.IsConfirmed = true;

                    return View(model);
                }
            }
        }
        catch (Exception ex)
        {
            throw new Exception("arf", ex);
        }

        return RedirectToAction("Index", "Home");
    }
}

最初の読み込み時に、テキストボックスに「false」が含まれています

投稿されると、モデルのプロパティ IsConfirmed が「true」に設定され、このモデルが同じビューに渡されます。

テキストボックスは「true」であると予想していますが、それでも「false」です...さらに、Preview プロパティが正しくレンダリングされているため、Model.IsConfirmed が実際に true であることを意味します...

何か不足していますか?

ありがとう

4

1 に答える 1

3

値を変更する場合は、必ず ModelState から値を削除してください。

ModelState.Remove("IsConfirmed");
model.IsConfirmed = true;

これを行う必要があるのは、設計上、すべての Html ヘルパー ( などTextBoxFor) はバインド時に最初に ModelState の値を検索し、モデルで値を使用することが見つからないためです。また、ModelState (POST 要求から取得) に同じ名前の値があるため、それが使用されています。

于 2013-02-25T16:17:58.877 に答える