我有一个表单,用户可以用他们想要的数据填写x次。表单将发布到以下操作。
[HttpPost]
public ActionResult Manage(ProductOptionModel DataToAdd)
{
if (!ModelState.IsValid)
{
return View(DataToAdd);
}
var ProdServ = new ProductService();
if (DataToAdd.ID != 0)
{
//Edit Mode.
DataToAdd = ProdServ.EditProductOption(DataToAdd);
ViewData["Message"] = "Option Changes Made";
}else
{
//Add
DataToAdd = ProdServ.AddProductOption(DataToAdd);
ViewData["Message"] = "New Option Added";
}
var RetModel = new ProductOptionModel() {ProductID = DataToAdd.ProductID};
return View(RetModel);
}
所以在底部我将模型空白(只留下必需的字段),然后返回到视图。但是,该视图包含先前提交的表单中的数据。
任何想法为什么?我调试了代码并检查了RetModel变量是否为空。
答案 0 :(得分:5)
在HTTP POST上返回视图时,Html帮助程序以这种方式工作。他们更喜欢发布数据而非模型值。
这就是为什么我建议你使用Asp.net MVC非常支持的Post/Redirect/Get模式。在POST成功完成后,您的控制器操作应该重定向到某些GET操作。
public ActionResult Process()
{
return View(new Data { Id = -1 });
}
[HttpPost]
public ActionResult Process(Data data)
{
if (!this.ModelState.IsValid)
{
return View(data);
}
new MyService().ProcessData(data);
return RedirectToAction("Process");
}
如果您显示所有先前输入的数据,您可以在GET操作中提供这些数据,或使用TempData
字典将其从POST转移到GET操作。
答案 1 :(得分:0)
这是因为输入助手的构建将首先查看已发布的数据并使用这些值(如果存在)。然后它会看模型。