Реализация поставщика профилей в ASP.NET MVC - PullRequest
63 голосов
/ 17 сентября 2008

Я не могу заставить 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, поэтому я не могу вернуть свой объект профиля, что, очевидно, приводит к сбою следующей строки, поскольку нуль.

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

<code><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?

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

Ответы [ 4 ]

56 голосов
/ 12 января 2009

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

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;      
}

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

6 голосов
/ 18 сентября 2008

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

6 голосов
/ 17 сентября 2008

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

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

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

1 голос
/ 04 ноября 2008

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

...