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