在 ASP.NET MVC 中实现配置文件提供程序
Posted
技术标签:
【中文标题】在 ASP.NET MVC 中实现配置文件提供程序【英文标题】:Implementing Profile Provider in ASP.NET MVC 【发布时间】:2010-09-09 21:32:46 【问题描述】:在我的一生中,我无法让 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 的 sn-p:
<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 项目集成?
提前谢谢你...
【问题讨论】:
【参考方案1】:这是你需要做的:
1) 在 Web.config 的部分,除了您的其他属性设置之外,添加“继承”属性:
<profile inherits="MySite.Models.ProfileCommon" defaultProvider="....
2) 从 Web.config 中删除整个 <properties>
部分,因为您已经在自定义 ProfileCommon 类中定义了它们,并且在上一步中还指示从自定义类继承
3) 将 ProfileCommon.GetProfile() 方法的代码更改为
public virtual ProfileCommon GetProfile(string username)
return Create(username) as ProfileCommon;
希望这会有所帮助。
【讨论】:
工作就像一个魅力。我所做的唯一更改是: public static new ProfileCommon Create( string username ) return ProfileBase.Create( username ) as ProfileCommon; 我在创建新用户时无法让它工作,所以我问了一个单独的问题,这导致了一个解决方案。如果您发现自己处于这种情况,这可能会有所帮助:***.com/questions/2547290/…【参考方案2】:不确定整个问题,但我在您的代码中注意到一件事:
ProfileCommon profile = (ProfileCommon)ProfileCommon.Create(user.UserName, user.IsApproved) as ProfileCommon;
您不需要同时使用 (ProfileCommon) 和 as ProfileCommon。它们都进行强制转换,但 () 抛出异常,而 as 如果无法进行强制转换,则返回 null。
【讨论】:
糟糕!这就是我在浏览器中修改粘贴代码的结果。很好的收获。【参考方案3】:试试Web Profile Builder。它是一个构建脚本,可以从 web.config 自动生成一个 WebProfile 类(相当于 ProfileCommon)。
【讨论】:
您是否能够验证这是否有效?我试了一下,还是有同样的问题。 我已经使用它取得了巨大的成功。工作得很好。只需确保将 WebProfile.CS 文件添加到项目中即可。我忽略了这一点,沮丧了大约一个小时。 这很好用,非常类似于使用 Web 表单配置文件提供程序。【参考方案4】:MVC Beta 中的 web.config 文件错误。 SqlProfileProvider 位于 System.Web.Profile,而不是 System.Web.Security。改变这个,它应该开始为你工作了。
【讨论】:
以上是关于在 ASP.NET MVC 中实现配置文件提供程序的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.NET MVC 应用程序中实现细粒度安全(即授权)的最佳机制是啥?