C# 要查看的MVC传递模型
My Index.cshtmlC# 要查看的MVC传递模型,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,My Index.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.re
@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
仍然显示“INDEX”,它没有变为“FILL”
我做错了什么?为什么它不想工作 @StephenMuecke在上面的评论中正确地回答了这个问题
你没有做错什么。您的
fillFields()
方法有一个参数ReportViewModel,因此当方法初始化时,它的值会添加到ModelState中。返回视图时,您的TextBoxFor()
方法使用ModelState
中的值(而不是模型属性)来设置文本框的值。解释了原因。正确的方法是遵循PRG模式–你没有做错任何事。您的fillFields()
方法有一个参数ReportViewModel
,因此当方法初始化时,它的值会添加到ModelState
。返回视图时,您的TextBoxFor()
方法使用ModelState
中的值(而不是模型属性)来设置文本框的值。解释了原因。正确的方法是遵循PRG模式,不要使用ModelState.Clear()
。遵循PRG模式并重定向!您的Index()
不应具有参数ReportViewModel
(它可能会由于多种原因而失败,并会创建一个难看的查询字符串)。现在还不清楚您的意图是什么,但最好的猜测是它应该是public ActionResult Index(string fileName)
,然后初始化您的模型并设置fileName
属性。在POST方法中,使用return RedirectToAction(“Index”,new{fileName=“FILL”})代码>是,但是(1)如果对象包含复杂对象或集合的属性,它将失败(2)您很容易超过查询字符串限制并引发异常(3)它创建了一个丑陋的查询字符串。Mihir Kale添加了一个答案。你可以接受:)