[Home] [Recent] [Site Map] [SharePoint] [XBOX]
I have been working a lot lately with the provider model, http://msdn2.microsoft.com/en-us/library/aa479030.aspx. Specifically I have been creating a custom MembershipUser to work with my custom MembershipProvider. The goal is to create a single provider that we can use for SharePoint forms based authentication and use in a custom ASP.net app.
Everything was going peachy until I started to create a class that inherited from the CreateUserWizard Control. The CreateUserWizard calls the MembershipProvider"s base CreateUser method in a method marked private called AttemptCreateUser(). Now since I created a custom MembershipUser that has additional parameters I cannot call my overloaded CreateUser method.
The best I could come up with is to use the OnCreatedUser method of the CreateUserWizard class. Here I cast the Membership.GetUser method to my Custom MembershipUser. Then fill the extra properties and call Membership.UpdateUser method. This works, but forces me to store null values or default values in the Database for those extra parameters of my custom MembershipUser. This is particularly troublesome if it has a FK relation to another table.
Has anyone come up with a better solution using the CreateUserWizard Control? Yes I know I could create my on control from the base Wizard class, but the CreateUserWizard control already offers everything, with the exception of overriding the AttemptCreateUser method.
Check out my fun and games creating a Lookup column using a feature
http://www.sharepointblogs.com/martinbailey/pages/lookup-column-feature.aspx
I have finally managed to put Anton"s code to the test in my own custom field type with great results.
The underlying issue is that the Update method does not seem to get called when adding a new field, and because there are a number of initializations of the field object the values in the custom propery editor controls get lost before you get to the OnAdded event where you could set them!
So, Anton"s plan (which I confirm works very well) is to store the values of the properties in a static string dictionary, keyed with the hash of the current SharePoint context SPContext.Current.GetHashCode() so we get the right property back out in the OnAdded event and can set the correct values.
You can get the full code in the thread linked to above, but I"ll summarize as best I can. I"m using a property called Application that is set by selecting a value from a combo box - which is actually part of a parent child combination used in the Property Editor, but that"s another story...
First we create a new dictionary in the Field Class (the one that inherits from the SPField... class) to store the properties:
private static Dictionary<int, string> updatedApplicationProperty = new Dictionary<int, string>();
Create a new method that the Property Editor Control can call to update the dictionary to the value in the property editor control:
public void UpdateApplicationProperty(string value)
{
updatedApplicationProperty[ContextId] = value;
}
Then, in the get for the property, return the dictionary stored property value if it exists or the internal value if not:
public string Application
get
{
if (updatedApplicationProperty.ContainsKey(ContextId))
{
//If we saved a value away and we"re in the middle of the save field process, then pull it out.
return updatedApplicationProperty[ContextId];
}
else
{
//Return the existing value for the application property. This will be the case if we already have a field.
return sApplication;
}
}
In the Update method of the Field Control set the custom property value and remove the stored property value:
this.SetCustomProperty("Application", this.Application);
if (updatedApplicationProperty.ContainsKey(ContextId))
updatedApplicationProperty.Remove(ContextId);
And, lastly, in the OnSaveChange event in the class for the Property Editor Control store the value of the control that represents the property into the dictionary via the Update...Property method for a new field, or set the property as normal if the field already exists:
BDCField currentBDCField = field as BDCField;
if (isNewField)
{
currentBDCField.UpdateApplicationProperty(this.cboApplications.SelectedValue);
}
else
{
currentBDCField.Application = this.cboApplications.SelectedValue;
}
Hopefully that"s a reasonable description of the required steps. Anton has a good description of the why he chose the static dictionary in the forum post.
Thanks again Anton and sorry it took me sooooo long to try it out!!!
Site List:
>>Xbox Live_s Major Nelson
>>Xbox 360 & SharePoint 2007 Weblog
>>Carsten Keutmann_s Blog
>>Mohamed Zaki_s Blog [Sharepoint MVP]
>>The Mit_s Blog
>>Mart Muller_s Sharepoint Weblog
>>Microsoft SharePoint Products and Technologies Team Blog
>>SharePoint Solutions Blog
>>4GuysFromRolla.com Headlines
>>ASP.NET Blogs
>>SharePoint Blogs
>>SharePoint Blogs
>>Joel on Software
>>ADO Guy_s Rants and Raves
>>Microsoft Live Labs
>>GadgetNews
>>Windows Vista Team Blog
>>VoIP & Gadgets Blog
>>schrankmonster blog
>>Via Virtual Earth Blog
>>Feed
>>MSDN Blogs
>>Mashable!
Links:
Jack's Readings
Month Archives:
Oct 2007
Sep 2007
Top Tags:
social software social networking .NET mashable Sharepoint ASP.NET Web 2.0 Web2.0 Startups Community News Search Marketplace General Software Development AJAX Windows Vista Visual Studio Microsoft myspace Silverlight People Powered! YouTube Vista MOSS Featured News C# Events MOSS 2007 Google WPF Office 2007 Web Community Security General Personal Xbox 360 facebook Tools development SharePoint 2007 Fun Atlas Architecture ASP.NET AJAX myspace codes TheLongTail IIS SQL Server Developers Revenue Sharing Video Pictures WCF Mobile 2.0 Announcements Orcas MIX07 Arcade Team System JavaScript News
@2007 All rights Reserved |