2

我有一个登录页面。一旦用户成功登录,他们就可以查看和管理他们的个人资料/信息。这将通过从数据库中检索数据并显示在表单视图上来完成。

但是,我的 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:     }

用户配置文件.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" />
                &nbsp;<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" />
                &nbsp;<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>
        &nbsp;</p>

</asp:Content>

用户配置文件.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;

    }
4

4 回答 4

7

创建一个新的 SqlParameter 并将其添加到集合中。

SqlParameter param = new SqlParameter("@UserId", currentUserId);
e.Command.Parameters.Add(param);
于 2012-06-30T17:17:20.890 回答
5

尝试以下操作:

DbParameter param = e.Command.CreateParameter();
param.ParameterName = "@UserId";
param.Value = currentUserId;
e.Command.Parameters.Add(param);

虽然我没有测试这个

于 2012-06-30T17:45:45.600 回答
0

您必须添加参数

e.Command.Parameters.AddWithValue("@UserId", currentUserId);

添加后,您可以通过索引器访问它,如示例中所示。


更新

如果您正在使用System.Data.Common命名空间,则该AddWithValue方法不可用。你将不得不做类似的事情

var param = e.Command.CreateParameter("@UserId", currentUserId);
e.Command.Parameters.Add(param);

这有点复杂,但优点是您不必隐式创建特定类型的参数,例如SqlParamteror OleDbParameter

于 2012-06-30T16:44:37.117 回答
0

如果您的 SqlDataSource 中已经列出了参数,那么只需指向它并更改它的值...

e.Command.Parameters["@UserId"].Value = currentUserId;

您不需要创建参数,除非您没有在您的 ASP 页面中将其列出。

于 2014-05-16T05:23:47.993 回答