如何在MVC中发布表单后防止页面刷新时在数据库中重复输入

时间:2013-03-11 13:35:36

标签: asp.net-mvc

我在mvc 4.0中提交了一个关于提交事件的表单。提交表单后,将其发布到其操作并创建记录。在刷新页面创建记录后,创建另一个重复记录。

我已经使用过以下但没有成功:

ModelState.Clear();
ModelState.SetModelValue("Key", new ValueProviderResult(null, string.Empty, CultureInfo.InvariantCulture));
ModelState.Remove("Key");

我不想使用AJAX表单发布,也不想在另一个页面上重定向。

我们是否在mvc4.0中使用像!Page.IsPostBack()这样的asp.net。

我也不想使用会话。

(微软吹嘘MVC MVC没有像asp.net这样的任何视图状态,但现在我不这么认为。)

2 个答案:

答案 0 :(得分:2)

您可以在成功更新后重定向到索引操作。在这种情况下,刷新将重新发送索引操作的请求,而不是发布更新操作。此模式称为“Post-Redirect-Get”模式。 例如:

[HttpPost]
public ActionResult Update(SomeModelViewClass model)
{
   //some code that save data to db
   return RedirectToAction("index", new {id=model.Id});
}

[HttpGet]
public ActionResult Index(Guid id)
{
   //some code that get data from db by id
   return View(model);
}

答案 1 :(得分:1)

您可以使用Ajax.post提交表单。构建您的表单标记,如下所示。

@using (@Html.BeginForm("Index", "ControllerName", FormMethod.Post, new { id = "anyFormName" }))

从页面调用ajax帖子。

$.ajax({
        url: "/ControllerName/Index",
        type: "POST",
        data: $("#anyFormName").serialize(),
        success: function (data) {
            $("#divFormContainer").html(data);
        }
    });

在控制器中创建如下所示的Index方法。

[HttpPost]
public ActionResult Index(FormCollection fc)
{
   // Put the form post logics here....
   // Build the model for the view...
   return PartialView("Index", model);
}