重新显示页面

时间:2017-07-05 15:14:32

标签: c# asp.net-mvc

我有一个页面,可以让我创建并保存记录。当我单击“保存”时,我希望保持在同一页面上,但让该页面显示更新的视图模型。我遇到的问题是,在保存后,GET参数会保留在页面网址中。

当我运行我的应用程序时,我会转到"列表记录"页面并点击"创建新的"按钮。这会导致GET EditRecordcreateNew请求,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,因为这会导致不必要的数据库访问为了重新显示相同的记录。

2 个答案:

答案 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")
}

但这是非常糟糕的解决方案