2

私はSqlDataSourceを使用してuserprofileのDetailsViewをバインドしています。これにより、ユーザーは自分の情報を表示し、同時に詳細を変更できます。(選択、取得、更新)

ただし、このエラーが発生しました。ハイパーリンクをクリックして[ユーザープロファイル]ページに移動したときに、選択したデータソースに「ユーザー名」という名前のフィールドまたはプロパティが見つかりませんでした。

Exception Details: System.Web.HttpException: A field or property with the name 'Username' was not found on the selected data source.

Source Error: 

An unhandled exception was generated during the execution of the current web request.   Information regarding the origin and location of the exception can be identified using the   exception stack trace below.

これは、userprofile.aspxファイル内のコードです。

  <asp:DetailsView ID="UserProfile" runat="server" 
        AutoGenerateRows="False" DataKeyNames="UserId" 
        DataSourceID="UserProfileDataSource" DefaultMode="Edit" 
        onitemupdated="UserProfile_ItemUpdated">
        <Fields>
           <asp:BoundField DataField="Username" HeaderText="Username" 
                SortExpression="Username" />
            <asp:BoundField DataField="HomeTown" HeaderText="HomeTown" 
                SortExpression="HomeTown" />
            <asp:BoundField DataField="HomepageUrl" HeaderText="HomepageUrl" 
                SortExpression="HomepageUrl" />
            <asp:BoundField DataField="Signature" HeaderText="Signature" 
                SortExpression="Signature" />
            <asp:CommandField ShowEditButton="True" />
        </Fields>
    </asp:DetailsView>

    <asp:SqlDataSource ID="UserProfileDataSource" runat="server" 
        ConnectionString="<%$ ConnectionStrings:SecurityTutorialsConnectionString %>" 

        SelectCommand="SELECT * FROM [UserProfiles] WHERE ([UserId] = @UserId)" 
        onselecting="UserProfileDataSource_Selecting" 
        UpdateCommand="UPDATE UserProfiles SET
        Username = @Username,
        HomeTown = @HomeTown,
        HomepageUrl = @HomepageUrl,
        Signature = @Signature   WHERE UserId = @UserId ">

        <SelectParameters>
        <asp:Parameter Name="UserId" Type="Object" />
        </SelectParameters>
        <UpdateParameters>
            <asp:Parameter Name="HomeTown" />
            <asp:Parameter Name="HomepageUrl" />
            <asp:Parameter Name="Signature" />
            <asp:Parameter Name="UserId" />
        </UpdateParameters>
    </asp:SqlDataSource>

これはuserprofile.aspx.csの背後にあるコードです:

 protected void UserProfileDataSource_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;
    }

編集 私はSQLクエリを次のように変更しました:

 SelectCommand= "SELECT [aspnet_Membership].UserId, [HomeTown], [HomepageUrl], [Signature] FROM [UserProfiles] INNER JOIN [aspnet_Membership] ON aspnet_Membership.UserId = UserProfiles.UserId WHERE aspnet_Membership.UserId=@UserId"
    onselecting="UserProfileDataSource_Selecting"
    UpdateCommand="UPDATE UserProfiles SET
    Username = @Username,
    HomeTown = @HomeTown,
    HomepageUrl = @HomepageUrl,
    Signature = @Signature   WHERE UserId = @UserId ">

ただし、エラーは引き続き表示されます。「ユーザー名」という名前のフィールドまたはプロパティが、選択したデータソースで見つかりませんでした。

4

2 に答える 2

4

UserProfilesテーブルのフィールド名を確認してください。ユーザー名フィールドがないようです。SELECT * FROM ..構文を使用するのではなく、SELECTするフィールドを明示的に指定することをお勧めします。

 <asp:BoundField DataField="Username" HeaderText="Username"  
                SortExpression="Username" /> 
于 2012-06-29T16:11:11.823 に答える
1

フィールドを並べ替えて、ユーザー名だけに問題があるかどうかを確認できますか?すなわち、

<asp:BoundField DataField="HomeTown" HeaderText="HomeTown" 
                SortExpression="HomeTown" />
<asp:BoundField DataField="Username" HeaderText="Username" 
                SortExpression="Username" />

データソースに問題がある場合は、「HomeTown」で例外が発生するはずです。その場合、パラメータの割り当てから@を削除することをお勧めします。

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

編集:変更されたSQLを確認した後、2つのこと:

  1. SelectCommandで、ユーザー名を選択していないようです。[aspnet_Membership].UserIdがユーザー名の場合、次のことができますSELECT [aspnet_Membership].UserId AS Username
  2. UpdateCommandでは、UserProfilesテーブルに値が存在しない場合でも、Usernameに値を割り当てています。そこでもJOINを使用する必要があります。
于 2012-06-29T16:12:43.710 に答える