Внедрение поставщика профилей в 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, поэтому я не могу вернуть объект профиля, что, очевидно, приводит к сбою следующей строки, поскольку профиль нуль.
Ниже приведен фрагмент моего 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>
MemberhipProvider работает без сбоев, поэтому я знаю, что строка подключения хороша.
На всякий случай это полезно, вот мой класс 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?
Спасибо заранее...
Ответы
Ответ 1
Вот что вам нужно сделать:
1) В разделе Web.config добавьте атрибут "inherits" в дополнение к вашим другим настройкам атрибута:
<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;
}
Надеюсь, что это поможет.
Ответ 2
Не уверен насчет всего вопроса, но я заметил это в вашем коде:
ProfileCommon profile = (ProfileCommon)ProfileCommon.Create(user.UserName, user.IsApproved) as ProfileCommon;
Вам не нужны оба (ProfileCommon) и как ProfileCommon. Они оба выполняют броски, но() выбрасывает и исключает, в то время как, как возвращает null, если приведение не может быть выполнено.
Ответ 3
Попробуйте Web Profile Builder. Это сборка script, которая автоматически генерирует класс WebProfile (эквивалентный ProfileCommon) из web.config.
Ответ 4
Файл web.config в бета-версии MVC неверен. SqlProfileProvider находится в System.Web.Profile, а не System.Web.Security. Измените это, и он должен начать работать для вас.