ASP.net - 我的用户名写了多次?

时间:2014-10-04 11:57:17

标签: c# sql asp.net

当我点击GridView时出现问题,因为我希望在重新加载后在其他页面上观看更多成员:http://i.gyazo.com/48e040f1d276984c0d3c6bfd8c38c974.png

<form id="form1" runat="server">
<div>

    <asp:Label ID="Label_welcome" runat="server" Text="Välkommen mr:"></asp:Label>

</div>
    <asp:Button ID="B_logout" runat="server" OnClick="B_logout_Click" Text="Logga ut" />
    <br />
    <br />
<embed src="CV.pdf" width=1400px height=1000px >
    <asp:SqlDataSource ID="SqlDataSourceRegister" runat="server" ConnectionString="<%$ ConnectionStrings:RegisterConnectionString %>" SelectCommand="SELECT * FROM [Table]"></asp:SqlDataSource>

</div>
    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellPadding="4" DataSourceID="SqlDataSourceRegister" ForeColor="#333333" GridLines="None" Height="195px" Width="254px" DataKeyNames="Id" OnSelectedIndexChanged="GridView1_SelectedIndexChanged">
        <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
        <Columns>
            <asp:CommandField ShowSelectButton="True" />
            <asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" ReadOnly="True" InsertVisible="False" />
            <asp:BoundField DataField="Användarnamn" HeaderText="Användarnamn" SortExpression="Användarnamn" />
            <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" />
            <asp:BoundField DataField="Lösenord" HeaderText="Lösenord" SortExpression="Lösenord" />
            <asp:BoundField DataField="Land" HeaderText="Land" SortExpression="Land" />
            <asp:BoundField DataField="Fullnamn" HeaderText="Fullnamn" SortExpression="Fullnamn" />
            <asp:TemplateField ShowHeader="False">

            </asp:TemplateField>
        </Columns>
        <EditRowStyle BackColor="#999999" />
        <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
        <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
        <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
        <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
        <SortedAscendingCellStyle BackColor="#E9E7E2" />
        <SortedAscendingHeaderStyle BackColor="#506C8C" />
        <SortedDescendingCellStyle BackColor="#FFFDF8" />
        <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
    </asp:GridView>

    <br />
    </form>

</div>

以上是我的代码,按钮&#39; n&#39;东西

   public partial class _1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        if (Session["New"] != null)
            {
                Label_welcome.Text += Session["New"].ToString();
            }
            else
            {
                Response.Redirect("Login.aspx");
            }
        }
        protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Response.Write("GridView1_SelectedIndexChanged");
        }
        protected void B_logout_Click(object sender, EventArgs e)
        {
            Session["New"] = null;
            Response.Redirect("Login.aspx");
        }
    }
}

2 个答案:

答案 0 :(得分:1)

当您为Text设置Label属性时,您输入的值将存储在页面的ViewState中,并在您进行回发时重新构建。每次从aspx源代码中读取。因此,代码中Text属性的值是这样的:

  1. 第一次请求:
    • 阅读ViewState :(没有任何内容)
    • 阅读aspx页面:“Välkommenmr:”
    • Page_Load:Text += "admin" = "Välkommen mr:" + "admin" = “Välkommenmr:admin”
    • 请求完成 - 值存储在ViewState
  2. 第二次请求:
    • 阅读ViewState“Välkommen先生:admin”
    • 从aspx页面读取 - 跳过,因为在ViewState
    • 中找到了
    • Page_Load:Text += "admin" = "Välkommen mr:admin" + "admin" = “Välkommenmr:adminadmin”
    • 请求完成 - 值存储在ViewState
  3. 要解决此问题,您有两种选择:

    1. 使用EnableViewState禁用ViewState的{​​{1}}。这意味着文本不会被保存,但请注意您在其上设置的其他属性也不会:
    2. Label

      1. 设置完整文字而不是使用+ =:
      2. <asp:Label ID="Label_welcome" runat="server" Text="Välkommen mr:" EnableViewState="false"></asp:Label>

答案 1 :(得分:0)

阅读您的代码我可以看到您尝试保留一个简单的单个会话变量来管理您网页的登录状态。

以这种方式执行操作的最大问题是ASP.NET会话缓存非常非常脆弱。

如果无法看到应用程序配置,我会做出有根据的猜测,默认值为20分钟就会生效。

这意味着如果页面静止没有被点击或与之交互20分钟或更长时间,那么你会突然发现你所保存的任何状态现在已经消失。

如果您在远程主机上创建.NET Web应用程序,您甚至可能会发现您的托管服务提供商已经进一步减少了这一点(我之前已经看到它们低至5到10分钟。

如果要实现健壮且功能正常的登录/注销方案,请使用.NET实际为ASP.NET会员系统提供的工具。

来自Rolla的#4; 4个家伙&#34;网站上有很多关于使用它的系列文章,可以在这里找到:http://www.4guysfromrolla.com/articles/120705-1.aspx

我还建议您查看较新的&#34; ASP.NET身份服务&#34;东西,特别是一切都朝着Owin&amp; Katana自托管堆栈。

ASP.NET Identity是即将推出的&#34; One Platform&#34;的新身份登录服务。微软的愿景,一切都是模块化和可互换的,一个单一的身份系统可以提供从本地机器上的所有内容到使用OAuth提供商(如Google或Twitter)进行身份验证的服务。