我有一个带文本框的简单表单(以及我想在特定情况下呈现的模型编辑器)
@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确实是真的......
我错过了什么吗?
由于
答案 0 :(得分:3)
如果要修改它,请确保从ModelState中删除该值:
ModelState.Remove("IsConfirmed");
model.IsConfirmed = true;
您需要这样做的原因是,根据设计,所有Html帮助程序(例如TextBoxFor
)将首先在绑定时在ModelState中查找值,但只是找不到它们将使用您的值模型。因为ModelState中有一个具有相同名称的值(来自POST请求),所以正在使用它。