即使在控制器端修改了布局字段上的TextBoxFor,也会呈现相同的值

时间:2013-02-25 16:15:58

标签: asp.net-mvc-3 razor

我有一个带文本框的简单表单(以及我想在特定情况下呈现的模型编辑器)

@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”,并将此模型传递给同一视图。

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

我错过了什么吗?

由于

1 个答案:

答案 0 :(得分:3)

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

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

您需要这样做的原因是,根据设计,所有Html帮助程序(例如TextBoxFor)将首先在绑定时在ModelState中查找值,但只是找不到它们将使用您的值模型。因为ModelState中有一个具有相同名称的值(来自POST请求),所以正在使用它。