我正在尝试学习MVC3。我已经使用TextBoxFor HTML帮助控件将值保留在多个帖子后面。
令人惊讶的是,价值持续存在,但未在观点中反映出来。
我的Model类看起来像这样:
public class FileViewModel
{
public string FileName { get; set; }
public string ValidationMsg { get; set; }
}
控制器中的My Actions方法如下所示:
public ActionResult DemoFormElements()
{
return View();
}
[HttpPost]
public ActionResult DemoFormElements(FileViewModel fVM)
{
fVM.FileName = "Overridden Text" + fVM.FileName ;
return View(fVM);
}
我的观点如下:
@using (@Html.BeginForm())
{
if (Model != null)
{
@Html.LabelFor(b => b.FileName)
@Html.TextBoxFor(n => n.FileName, Model.FileName)
}
else
{
@Html.LabelFor(b => b.FileName)
@Html.TextBoxFor(n => n.FileName)
}
<input type="submit" id="SubmitBtn" value="Ok" />
}
当我通过单击确定按钮发回来时,我能够获得我输入的值 文本框,但在控制器中我试图将该值附加到&#34;嗨&#34; &安培;期待我视图中的附加值,这不会发生......
我看到控件的值是持久的(无论我输入什么),但没有改变:( 如果它有预期的行为或者我在这里犯了什么错误,请帮我提一些线索?
答案 0 :(得分:2)
这有几个问题。在回发期间,您无法覆盖模型中的值,因为MVC将覆盖该值并保留旧值,以便在出现错误时重新显示它们。一般来说,您也不应该从POST处理程序返回视图,您应该使用PRG(Post-Redirect - Get)模式。这样做是为了如果用户在浏览器中单击“刷新”,则不会再次POST。所以,说了这么多,我会按如下方式更改控制器:
public ActionResult DemoFormElements()
{
var viewModel = new FileViewModel();
if( TempData.ContainsKey( "UpdatedFilename" )
{
viewModel = TempData["UpdatedFilename"];
}
return View( viewModel );
}
[HttpPost]
public ActionResult DemoFormElements(FileViewModel fVM)
{
TempData["UpdatedFilename"] = "Overridden Text" + fVM.FileName;
return RedirectToAction( "DemoFormElements" );
}
这也将简化您的视图,因为您不必对模型进行空检查,您将始终拥有模型。
@using (@Html.BeginForm())
{
@Html.LabelFor(model => model.FileName)
@Html.TextBoxFor(model => model.FileName)
<input type="submit" id="SubmitBtn" value="Ok" />
}
答案 1 :(得分:1)
您问题的直接解决方案可能是:
在控制器Post方法中,使用ModelState.Remove(“[Mode的属性名称]”),然后使用Controller为其分配新值。它应该是:ModelState.Remove(“FileName”);
或者使用ModelState.Clear():这会强制页面忘记所有先前的值&amp;清除所有以前的条目。
或者在视图页面上,将Html.TextBoxFor()更改为特定模型属性的Html.TextBox()。
或按照上面Craig的建议使用PRG模式:(重定向后 - 获取模式)。
从这些替代解决方案中选择一种符合您需求的解决方案。
答案 2 :(得分:0)
我会为get动作返回一个viewModel
public ActionResult Index()
{
return View(new FileViewModel());
}
我会将视图简化为此
<span>@Model.FileName</span>
@using (@Html.BeginForm())
{
@Html.LabelFor(m => m.FileName)
@Html.TextBoxFor(m => m.FileName)
<input type="submit" id="SubmitBtn" value="Ok" />
}