为了我的一生,我无法让SqlProfileProvider在我正在处理的MVC项目中工作。
我意识到的第一个有趣的事情是Visual Studio不会自动为您生成ProfileCommon代理类。没什么大不了的,因为扩展ProfileBase类很简单。创建ProfileCommon类之后,我编写了以下Action方法来创建用户个人资料。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| [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的摘要:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <profile defaultProvider="AspNetSqlProfileProvider" automaticSaveEnabled="false" enabled="true">
<providers>
<clear/>
</providers>
<properties>
</properties>
</profile> |
code>
MembershipProvider工作顺利,所以我知道连接字符串很好。
以防万一,这是我的ProfileCommon类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| 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)在Web.config的部分中,除了其他属性设置外,还添加" inherits"属性:
1
| <profile inherits="MySite.Models.ProfileCommon" defaultProvider=".... |
2)从Web.config中删除整个部分,因为您已经在自定义ProfileCommon类中定义了它们,并且还指示在上一步中从您的自定义类继承
3)将您的ProfileCommon.GetProfile()方法的代码更改为
1 2 3 4
| public virtual ProfileCommon GetProfile(string username)
{
return Create(username) as ProfileCommon;
} |
希望这可以帮助。
尝试使用Web Profile Builder。这是一个构建脚本,可以从web.config自动生成一个WebProfile类(与ProfileCommon等效)。
不确定整个问题,但我在您的代码中注意到了一件事:
1
| ProfileCommon profile = (ProfileCommon)ProfileCommon.Create(user.UserName, user.IsApproved) as ProfileCommon; |
您不需要(ProfileCommon)和as ProfileCommon。它们都进行强制类型转换,但是()会引发异常,而如果不能进行强制类型转换,则as将返回null。
MVC Beta中的web.config文件错误。 SqlProfileProvider位于System.Web.Profile中,而不位于System.Web.Security中。更改它,它应该开始为您工作。