我有一个登录页面。用户成功登录后,他们可以查看和管理其个人资料/信息。这可以通过从数据库检索数据并显示在formview上来完成。
但是,以下错误出现在我的userprofile.aspx.cs文件中:
Exception Details: System.IndexOutOfRangeException: An SqlParameter with ParameterName '@UserId' is not contained by this SqlParameterCollection. Source Error: Line 44: Line 45: // Assign the currently logged on user's UserId to the @UserId parameter Line 46: e.Command.Parameters["@UserId"].Value = currentUserId; Line 47: Line 48: }
Userprofile.aspx:
<asp:FormView ID="FormView1" runat="server" DataSourceID="SqlDataSource1" DataKeyNames="UserId"> <EditItemTemplate> UserId: <asp:Label ID="UserIdLabel1" runat="server" Text='<%# Eval("UserId") %>' /> <br /> Password: <asp:TextBox ID="PasswordTextBox" runat="server" Text='<%# Bind("Password") %>' /> <br /> Email: <asp:TextBox ID="EmailTextBox" runat="server" Text='<%# Bind("Email") %>' /> <br /> HomeTown: <asp:TextBox ID="HomeTownTextBox" runat="server" Text='<%# Bind("HomeTown") %>' /> <br /> HomepageUrl: <asp:TextBox ID="HomepageUrlTextBox" runat="server" Text='<%# Bind("HomepageUrl") %>' /> <br /> Signature: <asp:TextBox ID="SignatureTextBox" runat="server" Text='<%# Bind("Signature") %>' /> <br /> <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="Update" /> <asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel" /> </EditItemTemplate> <InsertItemTemplate> UserId: <asp:TextBox ID="UserIdTextBox" runat="server" Text='<%# Bind("UserId") %>' /> <br /> Password: <asp:TextBox ID="PasswordTextBox" runat="server" Text='<%# Bind("Password") %>' /> <br /> Email: <asp:TextBox ID="EmailTextBox" runat="server" Text='<%# Bind("Email") %>' /> <br /> HomeTown: <asp:TextBox ID="HomeTownTextBox" runat="server" Text='<%# Bind("HomeTown") %>' /> <br /> HomepageUrl: <asp:TextBox ID="HomepageUrlTextBox" runat="server" Text='<%# Bind("HomepageUrl") %>' /> <br /> Signature: <asp:TextBox ID="SignatureTextBox" runat="server" Text='<%# Bind("Signature") %>' /> <br /> <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert" Text="Insert" /> <asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel" /> </InsertItemTemplate> <ItemTemplate> UserId: <asp:Label ID="UserIdLabel" runat="server" Text='<%# Eval("UserId") %>' /> <br /> Password: <asp:Label ID="PasswordLabel" runat="server" Text='<%# Bind("Password") %>' /> <br /> Email: <asp:Label ID="EmailLabel" runat="server" Text='<%# Bind("Email") %>' /> <br /> HomeTown: <asp:Label ID="HomeTownLabel" runat="server" Text='<%# Bind("HomeTown") %>' /> <br /> HomepageUrl: <asp:Label ID="HomepageUrlLabel" runat="server" Text='<%# Bind("HomepageUrl") %>' /> <br /> Signature: <asp:Label ID="SignatureLabel" runat="server" Text='<%# Bind("Signature") %>' /> <br /> </ItemTemplate> </asp:FormView> </p> <p> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:SecurityTutorialsConnectionString %>" onselecting="SqlDataSource1_Selecting" SelectCommand="SELECT UserProfiles.UserId, aspnet_Membership.Password, aspnet_Membership.Email, UserProfiles.HomeTown, UserProfiles.HomepageUrl, UserProfiles.Signature FROM aspnet_Membership INNER JOIN UserProfiles ON aspnet_Membership.UserId = UserProfiles.UserId"> </asp:SqlDataSource> </p> <p> </p> </asp:Content>
Userprofile.aspx.cs:
protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e) { // Get a reference to the currently logged on user MembershipUser currentUser = Membership.GetUser(); // Determine the currently logged on user's UserId value Guid currentUserId = (Guid)currentUser.ProviderUserKey; // Assign the currently logged on user's UserId to the @UserId parameter e.Command.Parameters["@UserId"].Value = currentUserId; }
请尝试以下方法:
DbParameter param = e.Command.CreateParameter(); param.ParameterName = "@UserId"; param.Value = currentUserId; e.Command.Parameters.Add(param);
我虽然没有测试