对于我的生活,我无法让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>

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 票数:56 已采纳

这是你需要做的:

1)在Web.config的部分中,除了您的其他属性设置外,还要添加“inherits”属性:

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

希望这可以帮助。

===============>>#2 票数:6

不确定整个问题,但我在你的代码中注意到一件事:

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

您不需要(ProfileCommon)和ProfileCommon。 它们都进行强制转换,但是()抛出和异常,而as如果无法进行强制转换则返回null。

===============>>#3 票数:6

试用Web Profile Builder 它是一个构建脚本,可以从web.config自动生成WebProfile类(相当于ProfileCommon)。

===============>>#4 票数:1

MVC Beta中的web.config文件是错误的。 SqlProfileProvider位于System.Web.Profile中,而不是System.Web.Security中。 改变这一点,它应该开始为你工作。

  ask by senfo translate from so

未解决问题?本站智能推荐:

2回复

ASP.NET MVC 2和SQL表配置文件提供程序

我正在尝试将示例表配置文件提供程序从http://www.asp.net/downloads/sandbox/table-profile-provider-samples添加到新的MVC 2站点。 经过一些研究和摆弄,我已经到了一个看起来像这样的个人资料类。 和web.config
2回复

从错误代码背后访问Profile对象? (ASP.NET 2.0提供程序模型)

我一直在玩ASP.NET的成员资格,角色和配置文件提供程序。 为此,我最近设置了Microsoft Sample的自定义表配置文件提供程序(请参阅: http : //www.asp.net/downloads/sandbox/table-profile-provider-samples/ )
2回复

ASP.NET SQL配置文件提供程序 - ProfileBase.Create()方法是否命中了DB?

我正在使用SQLMemebershipProvider并使用Profiles。 我有一个名为UserProfile的自定义类,它继承自ProfileBase类,我使用它来设置自定义属性,如“FullName”。 我想循环遍历数据库中的所有用户并访问其配置文件属性。 在每次迭代中,我调用Pr
1回复

ASP.NET配置文件属性未在Silverlight应用中正确序列化

最近,我一直在使用Silverlight业务应用程序模板,使我习惯于Silverlight / WCF ria服务。 我遇到了一个不知道如何解决的奇怪问题。 到目前为止,我所做的只是创建了一个名为“ AvatarURL”的新配置文件属性,其基本概念来自此Avatar教程 ,并删除了Fri
1回复

动态创建用户个人资料页面-httphandler? 个人资料提供者?

我想动态创建一个显示用户信息(名称,地址,上载内容等)的用户个人资料页面。 我看过许多与此相关的在线教程,但不确定哪种方法最好。 我正在使用ASP.NET成员资格提供程序来存储用户数据。 我应该使用HTTPHandler并创建ashx文件吗? 还是直接在我的代码后面直接使用Request
1回复

如何在配置文件中存储数据表

如何在配置文件中存储数据表( Personalzition提供程序 ,自定义类型)
1回复

在后台代码中未获取配置文件属性

我试图在后面的代码中获取Profile属性。 但是我没有像Profile.Homephone或Profile.CellPhone这样的智能。 当我尝试: 我得到Data is Null 。 无法在Null值错误时调用此方法或属性。 我的个人资料表中有当前用户的数据。 我在即时窗
1回复

ASPNETDB-如何即时切换配置文件提供程序

我有一个使用ASPNETDB作为成员资格/角色/个人资料的网站。 该网站有一些管理页面,我想添加几个新页面,以便能够添加/编辑/删除该网站的用户。 我有两个不同的数据库连接字符串,具有不同的权限/安全级别。 我希望一个(“ ASPNETDBConnection”)仅用于网站登录过程
1回复

是否可以使用其成员资格用户ID检索用户个人资料?

使用Asp.net会员和个人资料提供商: 我能够使用其Membership UserID而不是其用户名来检索用户配置文件吗? 我问的原因是因为如果我有UserID而不是Username,我将不得不编写以下两行代码 代替: Dim Profile As Profile =
2回复

如何使用ASP.NET MVC实现自定义缓存提供程序

我正在将MonoRail应用程序迁移到ASP.NET MVC 1.0 。 在我的原始应用程序中,我编写了一个自定义缓存提供程序(使用memcached分布式缓存提供程序) 在MonoRail中,这个任务非常简单,因为框架使用了接口,并且ICacheProvider看起来像这样: 每个