asp.net 表单发布后页面重新加载错误?

velaa5lx  于 2023-04-08  发布在  .NET
关注(0)|答案(2)|浏览(195)

我正在使用ASP.NET Webmatrix,并试图通过Form Post请求从SQL数据库加载更多数据。
默认情况下,我有2个结果,当我点击加载更多按钮,每次结果增加+2。

一切正常!但是当我试图重新加载我的页面时,浏览器显示错误。

即使我的表单已经发布,但浏览器仍然显示重新提交错误。我该如何删除此错误?请帮助我!&以下是我的代码:

**.cshtml**
@{
    var rowsNumb = 2;
    var db = Database.Open("Northwind");
    if (IsPost){
        rowsNumb = Request["lastRec"].AsInt() + 2;
    }else{}
    var maxRecs = db.QueryValue("SELECT COUNT([Product Id]) FROM Products");
    var sql = @"SELECT * FROM Products ORDER BY [Product Id] 
                OFFSET 0 ROWS FETCH NEXT @0 ROWS  ONLY";
    rowsNumb = (rowsNumb > maxRecs ? maxRecs : rowsNumb);
    var result = db.Query(sql, rowsNumb);
}
<!DOCTYPE html>
<html lang="en">
    <head>
    </head>
    <body>
        <table>
            @foreach(var row in result){
                <tr>
                    <td>@row["Product Name"]</td>
                    <td>@row["English Name"]</td>
                    <td>@row["Unit Price"]</td>
                </tr>
            }
        </table>
        <form method="post">
            <input type="hidden" name="lastRec" value="@rowsNumb"/>
            <button type="submit">Load More</button>
        </form>
    </body>
</html>
0yycz8jy

0yycz8jy1#

不是错误

这不是浏览器或您的代码中的错误。这只是浏览器在询问用户是否希望加载与上次传递的数据相同的页面时提出的问题。没有错误!

原因

这是因为你通过提交表单来获取数据,所以它的行为就像你想通过传递一些数据来获取数据,比如用户名等。这就是为什么它要求这个对话框。

<button type="submit">Load More</button>

上面的按钮就是这个原因。
你可以做的是使用action并将自己转发到一个新的页面,在那里你将使用Response.Redirect()和一个额外的参数,可能是一个用户友好的www.example.com/products?page=2。在HTML中,你不会写page = 2或任何东西。但它会表示页面是新的,页面没有使用POST请求加载
这样,你就不会再看到这个对话框了。直到你使用提交按钮加载页面内容,你才会看到这个对话框。

变通方案

还有另一种方法可以做到这一点,那就是使用jQuery(我知道我知道jQuery总是不是唯一的函数,但是)并删除type="submit"属性。

<button id="submit">Load More</button>

处理这段代码的jQuery是

$('#submit').click(function () {
   // either use ajax to load the content and add it, or
   // use window.location() to move to the next page and
   // come back to this page using Response.Redirect();
}

ASP.NET的Response.Redirect方法
jQuery Ajax来自jQuery API

删除if(IsPost)

if (IsPost) { 
   rowsNumb = Request["lastRec"].AsInt() + 2;
   Response.Redirect("~/Default?v2");
}

这个代码块只会在有Header表示请求是post的时候执行(如果提交的表单有method="post",那么请求就是post)。所以如果你有这个代码块,使用我的想法是行不通的。
删除条件并执行它。

rowsNumb = Request["lastRec"].AsInt() + 2;
Response.Redirect("~/Default?v2");

就这样,这将更新变量2,然后再次提供结果。POST只会在请求通过表单发出并且方法设置为post时执行。这也是在UI中生成 error 的地方。

完整代码

@{
    var rowsNumb = 2;
    var db = Database.Open("Northwind");
    rowsNumb = Request["lastRec"].AsInt() + 2;
    // no need for else block since there is no code there
    var maxRecs = db.QueryValue("SELECT COUNT([Product Id]) FROM Products");
    var sql = @"SELECT * FROM Products ORDER BY [Product Id] 
            OFFSET 0 ROWS FETCH NEXT @0 ROWS  ONLY";
    rowsNumb = (rowsNumb > maxRecs ? maxRecs : rowsNumb);
    var result = db.Query(sql, rowsNumb);
}
<!DOCTYPE html>
<html lang="en">
    <head>
    </head>
    <body>
        <table>
            @foreach(var row in result){
                <tr>
                    <td>@row["Product Name"]</td>
                    <td>@row["English Name"]</td>
                    <td>@row["Unit Price"]</td>
                </tr>
            }
        </table>
        <a href="~/page?lastRec=@rowsNumb">Load More</a>
   </body>
</html>

如果我不得不写代码,上面的代码就是它自己。这段代码就是你所需要的全部。它会重新加载页面并更新内容等等。而不需要使用POST请求。

8zzbczxx

8zzbczxx2#

你可以在服务器端使用下面的代码。这将刷新页面。甚至你可以改变刷新页面的时间。

Response.AppendHeader("refresh", "2");

相关问题