我有一个页面,可以让我创建并保存记录。当我单击“保存”时,我希望保持在同一页面上,但让该页面显示更新的视图模型。我遇到的问题是,在保存后,GET
参数会保留在页面网址中。
当我运行我的应用程序时,我会转到"列表记录"页面并点击"创建新的"按钮。这会导致GET
EditRecord
个createNew
请求,true
参数设置为localhost/Home/EditRecord?createNew=True
。该请求看起来像public ActionResult EditRecord(string id, bool createNew = false)
{
MyRecordViewModel viewModel;
if (createNew)
{
viewModel = new MyRecordViewModel
{
IsNew = true
};
}
else
{
var myRecord = (from p in this.context.MyRecords
where p.Id = id
select p).FirstOrDefault();
if (myRecord == null)
{
this.ErrorMessage("Cannot find record.");
return View();
}
viewModel = new MyRecordViewModel(myRecord);
}
return View(viewModel);
}
POST
然后,当我点击“保存”时,[HttpPost]
public ActionResult EditRecord(MyRecordViewModel viewModel)
{
// Save record to database
// ...
// Update the view model
viewModel.LastUpdatedDttm = DateTime.Now;
// Clear the model state dictionary so that my updated view model's values will be shown on the page
ModelState.Clear();
// Go back to the same page with an updated view model
return View(viewModel);
}
转到此方法
localhost/Home/EditRecord?createNew=True
使用更新的视图模型正确显示更新的页面。问题是该网址仍为localhost/Home/EditRecord
。我希望网址为GET
我不想使用我的记录ID重定向回createNew
页面,并且function flipX() {
var obj = canvas.getActiveObject();
if (obj) {
obj.set('flipX', !obj.flipX);
canvas.renderAll();
}
}
function flipY() {
var obj = canvas.getActiveObject();
if (obj) {
obj.set('flipY', !obj.flipY);
canvas.renderAll();
}
}
等于false,因为这会导致不必要的数据库访问为了重新显示相同的记录。
答案 0 :(得分:1)
您需要使用PRG(Post-Redirect-Get)模式。简单地说,在您成功完成编辑或其他任何操作后,请不要再次返回视图,而是返回重定向。如果您想再次加载相同的页面,只需重定向到同一页面。关键是,通过执行重定向,您将重新加载所有新鲜内容而不会遗留在URL之类的内容中。这也忽略了做ModelState.Clear()
等反模式的必要性。
答案 1 :(得分:0)
public ActionResult EditRecord(string id, bool createNew = false)
{
id = id ?? TempData["id"];
//your code
}
[HttpPost]
public ActionResult EditProductAlias(MyRecordViewModel viewModel)
{
//your code
TempData[id] = viewModel.Id;
return RedirectToAction("EditRecord", "ControllerName")
}
但这是非常糟糕的解决方案