如何在asp.net中重新加载页面后保留JavaScript值?

如何在asp.net中重新加载页面后保留JavaScript值?,javascript,c#,jquery,html,asp.net,Javascript,C#,Jquery,Html,Asp.net,我的asp.net应用程序中有一个html表。单击td元素时,我使用JavaScript将该值存储在一个隐藏字段中 function rebind() { $('.window td').on('click', function () { var idName = this.id; var selectedid = idName.substring(1); console.log(selectedid);

我的asp.net应用程序中有一个html表。单击td元素时,我使用JavaScript将该值存储在一个隐藏字段中

function rebind() {
        $('.window td').on('click', function () {
            var idName = this.id;
            var selectedid = idName.substring(1);
            console.log(selectedid);
            $('#hidden').val(selectedid);
         });
      }
现在,我想在这个点击事件之后重新加载这个aspx页面,因为我需要根据td值显示新数据,我还想在重新加载或刷新后保留这个隐藏字段值,我想在服务器端aspx.cs上使用它

我试过像这样的ajax

$.ajax({
        url: "Default.aspx",
        data: selectedid,
        type: "POST",
        success: function (result) {
            alert('Yay! It worked!');
        },
        error: function (result) {
            alert('Error');
        }
    });
但我无法访问c端的selectedid变量。我想知道我的方向是否正确

<input type="hidden" id="MyHiddenField" name="MyHiddenField" />
<button type="button" onclick="setHiddenValue();">Set Hidden Value</button>
<br />
<asp:Button runat="server" Text="Cause Postback" OnClick="PostBackBtn_Click" />
<br />   
<asp:Label ID="ResultLbl" Text="No result yet, hit Set Hidden Value then Cause Postback." runat="server" />
<script type="text/javascript">
    function setHiddenValue() {
        $("#MyHiddenField").val("Hello, world!");
    }
</script>
您可以看到,现在我们已经在服务器端检索到该值,并使用它在回发时设置一个带有该值的标签。您可以使用另一个隐藏值将该值传递回JS,而不是使用标签

或者,将AJAX与。这样做的好处是页面不会重新加载。您可以将值发送到控制器,并让服务器返回一些更新的数据。这对于带宽来说是非常好的,因为实际上只有我们绝对需要来回发送的数据才会被发送。我们不必担心丢失JavaScript变量,因为页面从不重新加载,用户也不会收到回发闪烁

$.ajax({
    url: "api/Products/GetAllProductsForCategory?categoryId=" + $("#MyHiddenField").val);
    type: "GET"
})
.done(function(data){
    alert("received data: " + data);
    //now we'd turn the data into HTML and add it to the DOM
    });
ASP.NET Web API

public class ProductsController : ApiController
{
    public IEnumerable<Product> GetAllProductsForCategory(string categoryId)
    {
        return products.Where(p => p.Category == categoryId);
    }
}

如果您计划刷新整个页面,则可能需要使用该值设置cookie。其他选项可以是使用ajax加载数据,而不是刷新整个页面。Cookie、localStorage或向服务器端资源发出的ajax请求可保存/检索各种数据库。可能重复的@RoryMcCrossan使用sessionStorage比使用localStorage更好,localStorage在浏览器关闭后被清除,选项卡关闭后的会话存储。我看到您编辑了问题以显示AJAX尝试。但是,您只是在页面上发布。您应该发布到ASP.NET Web API而不是使用代码隐藏,您的服务器端代码将位于Web API控制器中。为什么我需要使用ASP.NET Web API?为什么我不能将数据发送到aspx.cs页面?因为不再支持WebMethod和PageMethod,并且支持ASP.NET Web API,而且它有一个更干净的使用模型,可以促进适当的关注点分离。实际上,我从未使用过ASP.NET Web API,我需要将发送的值作为参数传递给aspx.cs页面中的方法。我需要使用HttpClient从代码隐藏中调用web api吗?@nrvha我提供了两种不同的方法。如果你读了我答案的第一部分,我会解释如何做到这一点。第二个答案是我试图让您切换到一个更新的体系结构。这当然不是必需的,而且我能理解一个新的框架一开始看起来令人望而生畏,但我确实提供了一个指向Microsoft文档的链接,其中包括解释它的教程。是的。我理解。对于第一部分,很遗憾,我无法创建新按钮。单击HTMLTD元素时,应该进行回发,并且必须将值从客户端传输到服务器端。这就是为什么我想使用location.reload,但它不保留隐藏字段中的值。
public class ProductsController : ApiController
{
    public IEnumerable<Product> GetAllProductsForCategory(string categoryId)
    {
        return products.Where(p => p.Category == categoryId);
    }
}