63

对于我的一生,我无法让 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 项目集成?

先感谢您...

4

4 回答 4

56

这是您需要做的:

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

希望这可以帮助。

于 2009-01-12T08:25:20.520 回答
6

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

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

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

于 2008-09-17T06:45:13.877 回答
6

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

于 2008-09-18T16:06:42.990 回答
1

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

于 2008-11-04T04:53:02.097 回答