【发布时间】:2016-01-01 21:17:41
【问题描述】:
我的索引.cshtml
@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);
}
当我运行我的应用程序时,TextBox Text 属性设置为“INDEX”。此外,当我单击调用 fillFields 控制器操作的按钮时,TextBox 仍显示“索引”,它不会更改为“填充”。
我做错了什么?为什么它不想工作?
【问题讨论】:
-
你没有做错什么。你的
fillFields()方法有一个参数ReportViewModel,所以当方法初始化时它的值被添加到ModelState。当您返回视图时,您的TextBoxFor()方法使用来自ModelState的值(不是模型属性)来设置文本框的值。原因在here 进行了解释。正确的做法是遵循 PRG 模式 -
不要使用
ModelState.Clear()。遵循 PRG 模式并重定向! -
你的
Index()不应该有参数ReportViewModel model(它可能由于多种原因而失败,并且它会创建一个丑陋的查询字符串)。它不是很清楚你的意图是什么,但最好的猜测是它应该是public ActionResult Index(string fileName)然后初始化你的模型并设置FileName属性。在 POST 方法中,使用return RedirectToAction("Index", new { fileName = "FILL" }); -
是的,但是 (1) 如果对象包含复杂对象或集合的属性,它将失败 (2) 您可以轻松超过查询字符串限制并引发异常 (3) 它会创建一个丑陋的查询字符串。
-
Mihir Kale 添加了答案。你可以接受:)
标签: c# asp.net-mvc asp.net-mvc-4