我不知道我缺少什么,但我在Web.config文件中添加了配置文件属性,但无法访问代码中的Profile。 Item 或创建新配置文件。
答案 0 :(得分:178)
我今天遇到了同样的问题,并且学到了很多东西。
Visual Studio中有两种项目 - “网站项目”和“Web应用程序项目”。出于对我来说完全神秘的原因,Web应用程序项目不能直接使用配置文件。 ...强类型类不会从Web.config文件中为您神奇地生成,所以你必须滚动你自己。
MSDN中的示例代码假定您使用的是网站项目,他们告诉您只需向<profile>
添加Web.config
部分,然后与Profile.
一起参与属性,但这在Web应用程序项目中不起作用。
您可以选择两种方式:
(1)使用Web Profile Builder。这是您添加到Visual Studio的自定义工具,可以从Web.config中的定义自动生成所需的Profile对象。
我选择不这样做,因为我不希望我的代码依赖于这个额外的工具进行编译,当他们试图构建我的代码而没有意识到他们需要时,这可能会给其他人造成问题。这个工具。
(2)创建自己的类,派生自ProfileBase
以表示您的自定义配置文件。这比看起来容易。这是一个非常简单的示例,它添加了一个“FullName”字符串配置文件字段:
在您的web.config中:
<profile defaultProvider="SqlProvider" inherits="YourNamespace.AccountProfile">
<providers>
<clear />
<add name="SqlProvider"
type="System.Web.Profile.SqlProfileProvider"
connectionStringName="sqlServerMembership" />
</providers>
</profile>
在名为AccountProfile.cs的文件中:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Profile;
using System.Web.Security;
namespace YourNamespace
{
public class AccountProfile : ProfileBase
{
static public AccountProfile CurrentUser
{
get { return (AccountProfile)
(ProfileBase.Create(Membership.GetUser().UserName)); }
}
public string FullName
{
get { return ((string)(base["FullName"])); }
set { base["FullName"] = value; Save(); }
}
// add additional properties here
}
}
设置个人资料值:
AccountProfile.CurrentUser.FullName = "Snoopy";
获取个人资料值
string x = AccountProfile.CurrentUser.FullName;
答案 1 :(得分:17)
Web应用程序项目仍然可以使用ProfileCommon对象,但仅限于运行时。它的代码不是在项目本身生成的,而是由ASP.Net生成的类,并且在运行时存在。
获取对象的最简单方法是使用动态类型,如下所示。
在Web.config文件中声明配置文件属性:
<profile ...
<properties>
<add name="GivenName"/>
<add name="Surname"/>
</properties>
然后访问属性:
dynamic profile = ProfileBase.Create(Membership.GetUser().UserName);
string s = profile.GivenName;
profile.Surname = "Smith";
要保存对配置文件属性的更改:
profile.Save();
如果您习惯使用动态类型并且不介意缺少编译时检查和智能感知,则上述工作正常。
如果在ASP.Net MVC中使用它,如果将动态配置文件对象传递给视图,则必须执行一些额外的工作,因为HTML帮助程序方法不能很好地与动态的“模型”对象一起使用。在将配置文件属性传递给HTML帮助程序方法之前,必须将它们分配给静态类型变量。
// model is of type dynamic and was passed in from the controller
@Html.TextBox("Surname", model.Surname) <-- this breaks
@{ string sn = model.Surname; }
@Html.TextBox("Surname", sn); <-- will work
如果您创建自定义配置文件类,如上所述Joel,ASP.Net仍将生成ProfileCommon类,但它将继承自您的自定义配置文件类。如果您未指定自定义配置文件类,则ProfileCommon将从System.Web.Profile.ProfileBase继承。
如果您创建自己的配置文件类,请确保未在自定义配置文件类中已声明的Web.config文件中指定配置文件属性。如果你这样做,ASP.Net在尝试生成ProfileCommon类时会给出编译器错误。
答案 2 :(得分:13)
配置文件也可以在Web应用程序项目中使用。 可以在设计时或以编程方式在Web.config中定义属性。在Web.config中:
<profile enabled="true" automaticSaveEnabled="true" defaultProvider="AspNetSqlProfileProvider">
<providers>
<clear/>
<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="TestRolesNProfiles"/>
</providers>
<properties>
<add name="FirstName"/>
<add name="LastName"/>
<add name ="Street"/>
<add name="Address2"/>
<add name="City"/>
<add name="ZIP"/>
<add name="HomePhone"/>
<add name="MobilePhone"/>
<add name="DOB"/>
</properties>
</profile>
或以编程方式,通过实例化 ProfileSection 并使用 ProfilePropertySettings 和 ProfilePropertySettingsColletion 创建单个属性来创建个人资料部分,所有这些都在系统中.Web.Configuration命名空间。 要使用配置文件的这些属性,请使用System.Web.Profile.ProfileBase对象。如上所述,无法使用配置文件。语法访问配置文件属性,但可以通过实例化ProfileBase并使用 SetPropertyValue (“ PropertyName ”轻松完成“)和 GetPropertyValue {” PropertyName “)如下:
ProfileBase curProfile = ProfileBase.Create("MyName");
或访问当前用户的个人资料:
ProfileBase curProfile = ProfileBase.Create(System.Web.Security.Membership.GetUser().UserName);
curProfile.SetPropertyValue("FirstName", this.txtName.Text);
curProfile.SetPropertyValue("LastName", this.txtLname.Text);
curProfile.SetPropertyValue("Street", this.txtStreet.Text);
curProfile.SetPropertyValue("Address2", this.txtAdd2.Text);
curProfile.SetPropertyValue("ZIP", this.txtZip.Text);
curProfile.SetPropertyValue("MobilePhone", txtMphone.Text);
curProfile.SetPropertyValue("HomePhone", txtHphone.Text);
curProfile.SetPropertyValue("DOB", txtDob.Text);
curProfile.Save();
答案 3 :(得分:8)
在Visual Studio中创建新的Web站点项目时,将自动(自动)为您生成从Profile返回的对象。创建Web应用程序项目或MVC项目时,您必须自己动手。
这听起来可能比现在更困难。您需要执行以下操作:
答案 4 :(得分:3)
如果您使用的是Web应用程序项目,则无法在设计时即时访问Profile对象。这是一个可以为你做的实用工具:http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx。就个人而言,该实用程序在我的项目中导致错误,所以我最终滚动自己的配置文件类继承自ProfileBase。这根本不难做到。
答案 5 :(得分:2)
用于创建自定义类的MSDN演练(a.k.a.Joel的方法):
http://msdn.microsoft.com/en-us/magazine/cc163624.aspx
答案 6 :(得分:2)
我也遇到了同样的问题。但是我没有创建一个继承自ProfileBase的类,而是使用了HttpContext。
在web.config文件中指定属性,如下所示: -
现在,编写以下代码: -
编译并运行代码。您将获得以下输出: -
答案 7 :(得分:1)
Web Profile Builder对我很有用。它生成的类比Joel的帖子描述的要多得多。是否真的需要或有用我不知道。
无论如何,对于那些寻找简单方法来生成类,但又不想拥有外部构建工具依赖关系的人,你总是可以
OR(未经测试但可能正常工作)
如果第二种方法有效,有人可以告诉我以供将来参考
答案 8 :(得分:1)
只想添加Joel Spolsky的回答
我实施了他的解决方案,工作出色btw - Cudos!
对于任何想要获取用户个人资料的人来说,这不是我使用的登录用户:
的web.config:
<connectionStrings>
<clear />
<add name="LocalSqlConnection" connectionString="Data Source=***;Database=***;User Id=***;Password=***;Initial Catalog=***;Integrated Security=false" providerName="System.Data.SqlClient" />
</connectionStrings>
和
<profile defaultProvider="SqlProvider" inherits="NameSpace.AccountProfile" enabled="true">
<providers>
<clear/>
<add name="SqlProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="LocalSqlConnection"/>
</providers>
然后是我的自定义类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Profile;
using System.Web.Security;
namespace NameSpace
{
public class AccountProfile : ProfileBase
{
static public AccountProfile CurrentUser
{
get
{
return (AccountProfile)
(ProfileBase.Create(Membership.GetUser().UserName));
}
}
static public AccountProfile GetUser(MembershipUser User)
{
return (AccountProfile)
(ProfileBase.Create(User.UserName));
}
/// <summary>
/// Find user with matching barcode, if no user is found function throws exception
/// </summary>
/// <param name="Barcode">The barcode to compare against the user barcode</param>
/// <returns>The AccountProfile class with matching barcode or null if the user is not found</returns>
static public AccountProfile GetUser(string Barcode)
{
MembershipUserCollection muc = Membership.GetAllUsers();
foreach (MembershipUser user in muc)
{
if (AccountProfile.GetUser(user).Barcode == Barcode)
{
return (AccountProfile)
(ProfileBase.Create(user.UserName));
}
}
throw new Exception("User does not exist");
}
public bool isOnJob
{
get { return (bool)(base["isOnJob"]); }
set { base["isOnJob"] = value; Save(); }
}
public string Barcode
{
get { return (string)(base["Barcode"]); }
set { base["Barcode"] = value; Save(); }
}
}
}
像魅力一样......
答案 9 :(得分:0)
很棒的帖子,
只是关于web.config的说明 如果你没有在profile元素中指定inherit属性 您需要在配置文件中指定每个indiviudal配置文件属性 web.config上的元素如下所示
<properties>
<clear/>
<add name="property-name-1" />
<add name="property-name-2" />
..........
</properties>