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”,并且此模型被传递到同一视图。

我希望文本框是“真”,但它仍然是“假”......而且 Preview 属性被正确渲染,所以这意味着 Model.IsConfirmed 确实是真的......

我错过了什么吗?

谢谢

4

1 回答 1

3

如果您打算修改它,请确保从 ModelState 中删除该值:

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

您需要这样做的原因是,按照设计,所有 Html 帮助程序(例如TextBoxFor)在绑定时将首先在 ModelState 中查找一个值,只有没有找到它们才会使用您的模型上的值。并且由于 ModelState 中有一个同名的值(来自 POST 请求),这就是正在使用的值。

于 2013-02-25T16:17:58.877 回答