2015-10-05 224 views
7

我Index.cshtmlMVC模型通过查看

@model ReportGenerator.WebUI.Models.ReportViewModel 
@Html.TextBoxFor(m => m.report.FileName, new { @class = "form-control", id = "FileName" }) 

我控制器

public ActionResult Index(ReportViewModel model) 
{ 
    ...some stuff 
    model.report = new Report(); 
    model.report.FileName = "INDEX"; 
    return View(model); 
} 

public ActionResult fillFields(ReportViewModel _model) 
{ 
    ...some stuff 
    _model.report = new Report(); 
    _model.report.FileName = "FILL"; 
    return View("Index", _model); 
} 

当我运行我的应用程序TextBoxText属性设置为 “索引”。当我点击一个按钮,调用fillFields控制器动作时,TextBox仍然显示“INDEX”,它不会更改为“FILL”。

我在做什么错?为什么它不想工作?

+5

你没有做错什么。你的'fillFields()'方法有一个参数'ReportViewModel',所以当方法被初始化时,它的值被添加到'ModelState'中。当您返回视图时,您的'TextBoxFor()'方法使用来自'ModelState'(不是模型属性)的值来设置文本框的值。这样做的原因解释[这里](http://stackoverflow.com/questions/26654862/textboxfor-displaying-initial-value-not-the-value-updated-from-code/26664111#26664111)。正确的做法是遵循PRG模式 –

+0

谢谢!我用过ModelState.Clear();并且它正在工作 – Icet

+2

请勿使用'ModelState.Clear()'。遵循PRG模式并重定向! –

回答

1

@StephenMuecke在上述意见正确地回答了这一点。

你没有做错什么。你的fillFields()方法有一个参数ReportViewModel,所以当方法初始化时,它的值被添加到ModelState中。当您返回视图时,您的TextBoxFor()方法将使用ModelState(不是模型属性)中的值来设置文本框的值。原因解释here。正确的做法是遵循PRG模式 -