Как назначить значения профиля?

Я не знаю, чего мне не хватает, но я добавил свойства профиля в файл Web.config, но не могу получить доступ к профилю. В коде или создать новый профиль.

Ответ 1

У меня была такая же проблема сегодня, и я многому научился.

В Visual Studio есть два проекта: "Проекты веб-сайтов" и "Проекты веб-приложений". По причинам, которые являются для меня полной загадкой, проекты веб-приложений не могут напрямую использовать Профиль.... строго типизированный класс не магически сгенерирован для вас из файла Web.config, поэтому вам нужно сворачивайте свои собственные.

Пример кода в MSDN предполагает, что вы используете проект веб-сайта, и они сообщают вам просто добавить раздел <profile> к вашему Web.config, а участник - с свойством Profile., но это не работает в Проекты веб-приложений.

У вас есть два варианта для самостоятельной работы:

(1) Используйте Web Profile Builder. Это настраиваемый инструмент, который вы добавляете в Visual Studio, который автоматически генерирует требуемый объект Profile из вашего определения в Web.config.

Я решил не делать этого, потому что я не хотел, чтобы мой код зависел от этого дополнительного инструмента для компиляции, что могло вызвать проблемы для кого-то другого, когда они пытались создать мой код, не понимая, что им нужно этот инструмент.

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

Ответ 2

Проекты веб-приложений все еще могут использовать объект 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();

Вышеописанное работает отлично, если вам удобно использовать динамические типы и не против отсутствия проверки времени компиляции и intellisense.

Если вы используете это с 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.

Ответ 3

Профиль может также использоваться в проектах веб-приложений. Свойства могут быть определены в 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();

Ответ 4

При создании нового проекта веб-сайта в Visual Studio объект, который возвращается из профиля, будет (автоматически) создан для вас. Когда вы создаете проект веб-приложения или проект MVC, вам придется сворачивать самостоятельно.

Это, вероятно, звучит сложнее, чем есть. Вам необходимо сделать следующее:

  • Создайте базу данных с помощью aspnet_regsql.exe. Этот инструмент установлен вместе с платформой .NET.
  • Напишите класс, который происходит из ProfileGroupBase или установите Builder Web Profile (WPF), который может сгенерировать класс для вас из определения в Web.Config. Я использую WPB некоторое время, и до сих пор он сделал то, что от него ожидается. Если у вас много свойств, использование WPB может сэкономить довольно много времени.
  • Убедитесь, что соединение с базой данных правильно настроено в Web.Config.
  • Теперь вы настроены на создание экземпляра вашего класса профиля (в контроллере)
  • Вероятно, вам понадобятся значения свойств профиля в ваших представлениях. Мне нравится передавать объект профиля непосредственно в представление (а не отдельные свойства).

Ответ 5

Если вы используете проект веб-приложения, вы не можете получить доступ к объекту Profile во время разработки. Вот утилита, которая, мол, делает это для вас: http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx. Лично эта утилита вызвала ошибку в моем проекте, поэтому я перевернул свой собственный класс профиля для наследования из ProfileBase. Это было совсем не сложно.

Ответ 7

Я тоже сталкивался с той же проблемой. Но вместо создания класса, который наследуется от ProfileBase, я использовал HttpContext.

Укажите свойства в файле web.config следующим образом: ProfilePropertyWeb.config

Теперь напишите следующий код: -

Code Behind Profile Properties

Скомпилируйте и запустите код. Вы получите следующий результат: -

Output

Ответ 8

Web Profile Builder отлично поработал у меня. Класс, который он сгенерировал, имеет гораздо больше в нем, чем описанный Joel post. Независимо от того, действительно ли он нужен или полезен, я не знаю.

В любом случае для тех, кто ищет простой способ генерации класса, но не желая иметь зависимость внешнего инструмента сборки, вы всегда можете

  • используйте построитель веб-профиля.
  • удалите все его следы!
  • продолжать использовать сгенерированный класс профиля

ИЛИ (непроверенный, но может просто работать)

  • создать веб-проект сайта
  • создать свой элемент
  • привязать сгенерированный класс и скопировать его в проект веб-проекта

если этот второй подход действительно работает, кто-то может сообщить мне о будущих ссылках

Ответ 9

Просто хочу добавить к Джоэл Спольский ответ

Я реализовал его решение, блестяще работая 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(); }
        }
    }
}

Работает как шарм...

Ответ 10

Отличная почта,

Просто заметьте на web.config если вы не укажете атрибут inherit в элементе профиля вам нужно будет указать каждое отдельное свойство профиля внутри профиля на web.config, как показано ниже

 <properties>
    <clear/>
    <add name="property-name-1" />
    <add name="property-name-2" />
    ..........

 </properties>