Реализация поставщика профиля в ASP.NET MVC

Блин, я не могу заставить SqlProfileProvider работать в проекте MVC, над которым я работаю.

Первое, что я понял, это то, что Visual Studio не создает для вас автоматически прокси-класс ProfileCommon. Это не имеет большого значения, поскольку достаточно просто расширить класс ProfileBase. После создания класса ProfileCommon я написал следующий метод Action для создания профиля пользователя.

[AcceptVerbs("POST")]
public ActionResult CreateProfile(string company, string phone, string fax, string city, string state, string zip)
{
    MembershipUser user = Membership.GetUser();
    ProfileCommon profile = ProfileCommon.Create(user.UserName, user.IsApproved) as ProfileCommon;

    profile.Company = company;
    profile.Phone = phone;
    profile.Fax = fax;
    profile.City = city;
    profile.State = state;
    profile.Zip = zip;
    profile.Save();

    return RedirectToAction("Index", "Account"); 
}

Проблема, с которой я столкнулся, заключается в том, что вызов ProfileCommon.Create () не может быть приведен к типу ProfileCommon, поэтому я не могу вернуть свой объект профиля, что, очевидно, приводит к сбою следующей строки, поскольку profile имеет значение null.

Ниже приведен фрагмент моего файла web.config:

<profile defaultProvider="AspNetSqlProfileProvider" automaticSaveEnabled="false" enabled="true">
    <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" applicationName="/" />
    </providers>
    <properties>
        <add name="FirstName" type="string" />
        <add name="LastName" type="string" />
        <add name="Company" type="string" />
        <add name="Phone" type="string" />
        <add name="Fax" type="string" />
        <add name="City" type="string" />
        <add name="State" type="string" />
        <add name="Zip" type="string" />
        <add name="Email" type="string" >
    </properties>
</profile>

MembershipProvider работает без сбоев, поэтому я знаю, что строка подключения в порядке.

На всякий случай, вот мой класс ProfileCommon:

public class ProfileCommon : ProfileBase
    {
        public virtual string Company
        {
            get
            {
                return ((string)(this.GetPropertyValue("Company")));
            }
            set
            {
                this.SetPropertyValue("Company", value);
            }
        }

        public virtual string Phone
        {
            get
            {
                return ((string)(this.GetPropertyValue("Phone")));
            }
            set
            {
                this.SetPropertyValue("Phone", value);
            }
        }

        public virtual string Fax
        {
            get
            {
                return ((string)(this.GetPropertyValue("Fax")));
            }
            set
            {
                this.SetPropertyValue("Fax", value);
            }
        }

        public virtual string City
        {
            get
            {
                return ((string)(this.GetPropertyValue("City")));
            }
            set
            {
                this.SetPropertyValue("City", value);
            }
        }

        public virtual string State
        {
            get
            {
                return ((string)(this.GetPropertyValue("State")));
            }
            set
            {
                this.SetPropertyValue("State", value);
            }
        }

        public virtual string Zip
        {
            get
            {
                return ((string)(this.GetPropertyValue("Zip")));
            }
            set
            {
                this.SetPropertyValue("Zip", value);
            }
        }

        public virtual ProfileCommon GetProfile(string username)
        {
            return ((ProfileCommon)(ProfileBase.Create(username)));
        }
    }

Есть мысли о том, что я делаю неправильно? Кто-нибудь из вас успешно интегрировал ProfileProvider в свои проекты ASP.NET MVC?

Заранее спасибо...


person senfo    schedule 17.09.2008    source источник


Ответы (4)


Вот что вам нужно сделать:

1) В разделе Web.config добавьте атрибут «наследуется» в дополнение к другим настройкам атрибута:

<profile inherits="MySite.Models.ProfileCommon" defaultProvider="....

2) Удалите весь раздел <properties> из Web.config, поскольку вы уже определили их в своем настраиваемом классе ProfileCommon, а также получили указание наследовать от вашего настраиваемого класса на предыдущем шаге.

3) Измените код вашего метода ProfileCommon.GetProfile () на

public virtual ProfileCommon GetProfile(string username)        
{            
     return Create(username) as ProfileCommon;      
}

Надеюсь это поможет.

person Community    schedule 12.01.2009
comment
Работал как шарм. Единственное изменение, которое я сделал, было: общедоступный статический новый ProfileCommon Create (строка username) {return ProfileBase.Create (username) as ProfileCommon; } - person tvanfosson; 15.12.2009
comment
Мне не удалось заставить это работать при создании нового пользователя, поэтому я задал отдельный вопрос, который привел к решению. Если вы оказались в такой ситуации, это может помочь: stackoverflow.com/questions/2547290/ - person Jeremy Gruenwald; 31.03.2010

Не уверен во всем вопросе, но одну вещь я заметил в вашем коде:

ProfileCommon profile = (ProfileCommon)ProfileCommon.Create(user.UserName, user.IsApproved) as ProfileCommon;

Вам не нужны и (ProfileCommon), и как ProfileCommon. Оба они выполняют приведение, но () выдает и исключение, в то время как as возвращает нуль, если приведение не может быть выполнено.

person Mladen Mihajlovic    schedule 17.09.2008
comment
Ой! Вот что я получаю за изменение вставленного кода в моем браузере. Хороший улов. - person senfo; 17.09.2008

Попробуйте Web Profile Builder. Это сценарий сборки, который автоматически генерирует класс WebProfile (эквивалент ProfileCommon) из файла web.config.

person Dave Dunkin    schedule 18.09.2008
comment
Удалось ли вам убедиться, что это работает? Я попробовал, и у меня все еще та же проблема. - person senfo; 19.09.2008
comment
Я использовал это с большим успехом. Работал нормально. Просто убедитесь, что вы добавили в проект файл WebProfile.CS. Я упустил это из виду и около часа расстраивался. - person Ryan Skarin; 23.09.2008
comment
Это прекрасно работает и очень похоже на работу с поставщиком профиля веб-форм. - person bzlm; 21.09.2009

Файл web.config в бета-версии MVC неверен. SqlProfileProvider находится в System.Web.Profile, а не в System.Web.Security. Измените это, и он должен начать работать на вас.

person Community    schedule 04.11.2008