Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在ASP.NET MVC中有什么替代方法可以进行POST重定向获取?_Asp.net Mvc_Usability - Fatal编程技术网

Asp.net mvc 在ASP.NET MVC中有什么替代方法可以进行POST重定向获取?

Asp.net mvc 在ASP.NET MVC中有什么替代方法可以进行POST重定向获取?,asp.net-mvc,usability,Asp.net Mvc,Usability,通过post提交表单,然后重定向到相同或不同URL的ASP.NETMVC模式非常容易编码 想象一下这个场景: 用户进入/products/42/edit查看和编辑产品42 他们在那个页面上看到一些疯狂的东西,编辑它,然后点击save。这会导致一篇文章被编辑到/products/42/edit 该操作更新数据并重定向到或返回/products/42/edit 用户看到更新后的数据并感到高兴 一小时后,他们点击“刷新”按钮,查看是否有人对产品42进行了修改 因为上次对/products/42/edi

通过post提交表单,然后重定向到相同或不同URL的ASP.NETMVC模式非常容易编码

想象一下这个场景:

  • 用户进入/products/42/edit查看和编辑产品42
  • 他们在那个页面上看到一些疯狂的东西,编辑它,然后点击save。这会导致一篇文章被编辑到/products/42/edit
  • 该操作更新数据并重定向到或返回/products/42/edit
  • 用户看到更新后的数据并感到高兴
  • 一小时后,他们点击“刷新”按钮,查看是否有人对产品42进行了修改
  • 因为上次对/products/42/edit的检索是一篇文章,所以他们的浏览器要求重新提交表单数据。这既恼人又危险,因为它会覆盖其他人的数据
  • 我担心,即使我使用两个不同的URL发布和获取(比如/products/42/edit/products/42),浏览器仍会要求重新发布,并可能破坏数据。我弄错了吗

    可以使用哪些替代方法,以便在提交产品更改后,用户可以安全地点击“刷新”以获得更新的视图

    更新我现在明白了,我的问题和我的设计都搞砸了,我为此道歉。我发现在POST和GET之间共享URL(操作)对我来说是个坏主意。那么,如果这两者不同,那么我就不会有“刷新导致重新发布”的问题,这是对的吗?

    Ajax表单提交


    请参见和,

    您的意思是,当用户点击“刷新”时,您会看到一个过时的视图。由此,我假设您的GET操作使用了POST操作中存储在TempData中的某个对象。在这种情况下,一种可能的解决方法是使用Session而不是TempData来存储POST操作的结果。

    为了让您的过账表单按照您描述的方式工作,它需要从数据库读取数据并预填充表单上的字段。它需要在您第一次输入有问题的URL时就这样做

    然后,在发布时,需要在验证值后将其保存到数据库中。这将完成您的往返循环

    如果页面是空白的“新记录”页面,那么您是对的,它只会在验证失败时往返一次。在F5上,它只会根据设计为您提供一个新的空白表单。

    您的更新:是

    使用/product/{id}/进行查看,使用/product/{id}/edit进行编辑,编辑后将它们重定向到/product/{id}/


    问题解决了。我想知道为什么您正在/正在使用/product/{id}/edit进行查看和编辑。

    如果您确实想查看和编辑同一个页面,并且需要处理并发性,则可以包含保持上次更新日期的隐藏字段。因此,流程将是:

  • User1提交数据
  • 相同的页面被呈现,但是带有日期元素(比如date1)
  • User2提交此页面
  • User1再次提交。该操作将比较date1和实际更新日期
  • 在这种情况下,它们是不同的,所以操作不应该更新并告诉用户

  • 这只是另一种选择。

    尽管我同意前面的答案中所说的,即在文章完成后不再将用户返回编辑视图;它没有回答为什么推动刷新会重新发布表单的问题

    以下是“刷新浏览器导致另一篇文章”问题的解决方案

    目前,您正在这样做:

    [AcceptVerbs(HttpVerbs.Post)]    // <--  this action will be used for POSTs
    EditProduct(string data1, string data2) 
    {
        // Handle Data, save to DB
        // Do some work
        return View("EditProduct");  //  <-- You are rendering the view from
    }                                //      A post action - this is bad!  
    

    [AcceptVerbs(HttpVerbs.Post)]//当用户点击F5时,对表单进行轴化将没有任何帮助。这取决于表单是否足够聪明,能够识别当前状态,不是吗?但是如果表单足够聪明,能够识别当前状态,那么在没有AJAX的情况下也可以工作。我想Frank Krueger的一些示例代码会让事情变得更清楚。我不理解这个问题。用户提交他们的编辑,这些编辑被写入数据库,然后用户被定向到产品的当前视图。他们点击F5和产品更新的当前视图。问题在哪里?考虑在你的控制器方法和你的视图中张贴一些代码,这样我们就可以看到发生了什么。我已经澄清了这个问题(我希望)。我发现在POST和GET之间共享URL对我来说是个坏主意。那么,如果这两个是不同的,那么我就不会有“刷新原因重新发布”的问题吗?附录:如果你真的想在同一个页面中查看和编辑,那么你应该考虑Ajax化你的表单。在一个成功的帖子之后重定向到一个GET始终是个好主意。但是,如果ModelState无效,可以简单地调用GET EditProduct方法。调用EditProduct方法将重建视图,MVC框架将使用ModelState中的发布值覆盖任何模型数据。。。祝贺你!:)版本号会比日期更好
    
    [AcceptVerbs(HttpVerbs.Post)]    //  <-- This action will be used for POSTs
    EditProduct(string data1, string data2) 
    {
        // Handle Data, save to DB
        // Do some work
        return RedirectToAction("EditProduct"); // <-- Redirect to a GET Action
    }
    
    [AcceptVerbs(HttpVerbs.Get)]   //  <-- This action will be used for GETs
    EditProduct() 
    {
    
        return View("EditProduct"); // <-- Render the view from the GET action
    }                               //     So when you refresh it will refresh the GET