0

我正在使用 MVC4,我想在配置文件中存储几个值。

为什么

TempData["badgerName"] = Profile.BadgerName;

说 ProfileBase 不包含 BadgerName 的定义?

我已经设置了如下配置文件。

<profile defaultProvider="DefaultProfileProvider">
  <providers>
    <add 
      name="DefaultProfileProvider" 
      type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
      connectionStringName="FALContext" 
      applicationName="/" />
  </providers>
  <properties>
    <add name="BadgerName" type="String"/>
  </properties>
</profile>
4

1 回答 1

1

在 ASP MVC 中,您没有使用 web.config 文件中定义的属性为您的站点生成配置文件对象。Profile可以从控制器方法访问的属性属于类型ProfileBase请参阅 msdn),并且不包含自定义配置文件属性的强类型属性。您可能还知道,在请求开始时为登录用户加载此配置文件,并且在请求结束时保存任何更改。

您可以通过不同的方式ProfileBase来上课。最常用的是:

  • 直接使用 ProfileBase 类
  • 创建派生的自定义配置文件类。

直接使用时ProfileBase,您需要使用控制器方法中的实例或获取给定用户名的实例。然后您应该使用索引器来访问配置文件属性。假设您的控制器方法收到一个 UserModel 类型的对象,其中包含您的用户数据,例如电子邮件和 BadgerName,那么您可以编写如下代码:

//Getting the instance from the controller property:
ProfileBase profile = this.Profile; //or even: this.HttpContext.Profile
//You can also get the profile for a given existing user.
ProfileBase profile = ProfileBase.Create(userModel.Name);

//Then update properties using indexer 
profile["Email"] = userModel.Email;
profile["BadgerName"] = userModel.BadgerName; 
//Manually save changes
//(Can be skipped for the profile automatically loaded in the Controller)
profile.Save();

但是,如果您从 中创建派生类ProfileBase,您最终将以与最初预期相同的方式使用您的类。您将基本上创建一个具有强类型属性的包装类,该类使用索引器在内部访问 ProfileBase(方法摘要在这里):

public class MyCustomProfile : ProfileBase
{                       
    public string Email
    {     
        get { return base["Email"] as string; }     
        set { base["Email"] = value; }
    }

    public string BadgerName
    {     
        get { return base["BadgerName"] as string; }     
        set { base["BadgerName"] = value; }
    }

    //If needed, you can provide methods to recover profiles 
    //for the logged in user or any user given its user name
    public static MyCustomProfile GetCurrent()
    {
        return Create(Membership.GetUser().UserName) as MyCustomProfile;
    }

    public static MyCustomProfile GetProfile(string userName)     
    {
        return Create(userName) as MyCustomProfile;     
    }
}

如果您使用此选项,您还需要确保<profile>web.config 的元素具有inherits设置为您的自定义模型类的属性:

<profile enabled="true" defaultProvider="DefaultProfileProvider" inherits="yourNamespace.MyCustomProfile">

有了这个代码和配置,您可以通过自己恢复用户配置文件或将控制器配置文件属性转换为您的自定义类来开始使用您的自定义配置文件类:

//Cast the Profile property of the controller to your custom class
MyCustomProfile profile = this.Profile as MyCustomProfile // or even: HttpContext.Profile as MyCustomProfile
//You could also manually load the profile for given an user name 
profile = MyCustomProfile.GetProfile(userModel.Name); 
//Or even manually load the profile for the logged in user
profile = MyCustomProfile.GetCurrent();

//Now get/set the profile properties using the strongly typed properties of your class
profile.Email= userModel.Email;
profile.BadgerName= userModel.BadgerName;
//Manually save changes
//(Can be skipped for the profile automatically loaded in the Controller)
profile.Save();

希望这可以帮助!

于 2013-02-28T20:38:40.020 回答