2013-03-11 79 views
2

我在mvc 4.0中提交了一个关于提交事件的表单。提交表单后发布到其操作并创建记录。创建记录后,当我刷新页面,然后创建另一个重复的记录。如何防止在MVC中发布表单后页面刷新时数据库中的重复条目

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

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

我不希望使用AJAX形成后,也不想另一页上重定向。

有没有什么办法可以在asp.net中使用,例如在mvc4.0中的!Page.IsPostBack()

我不想使用会话也。 (微软吹的MVC,MVC没有任何视图状态像asp.net,但现在我不这么认为)。

+1

Page.IsPostBack并不妨碍这一点,即使你写的代码说!Page.IsPostBack,因为浏览器重新完全相同requrest,这将是一个回传,并再次插入记录。 – 2013-03-11 13:37:45

+0

我要求解决方案!!Page.IsPostBack() – 2013-03-11 13:40:19

+0

状态将在哪里保存?浏览器在重新加载页面时不会修改请求,我没有会话,也没有Cookie。所以你的服务器端永远不会知道它是重复的。您必须写入数据库或重定向到某处,或将此状态存储在别处。 – Aneri 2013-03-11 13:48:16

回答

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); 
} 
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); 
} 
相关问题