Как назначить значения профиля? - PullRequest
110 голосов
/ 09 января 2009

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

Ответы [ 10 ]

178 голосов
/ 11 июля 2009

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

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

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

У вас есть два варианта броска:

(1) Используйте Web Profile Builder . Это пользовательский инструмент, который вы добавляете в Visual Studio, который автоматически генерирует нужный вам объект профиля из вашего определения в 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;
17 голосов
/ 04 июня 2011

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

Если вы создадите пользовательский класс профиля, как Джоэл описал выше, ASP.Net все равно сгенерирует класс ProfileCommon, но он унаследует от вашего пользовательского класса профиля. Если вы не укажете пользовательский профиль, класс ProfileCommon будет наследоваться от System.Web.Profile.ProfileBase.

Если вы создаете свой собственный класс профиля, убедитесь, что вы не указали свойства профиля в файле Web.config, который вы уже объявили в своем пользовательском классе профиля. Если вы сделаете это, ASP.Net выдаст ошибку компилятора при попытке создать класс ProfileCommon.

13 голосов
/ 29 октября 2013

Профиль можно использовать и в проектах веб-приложений. Свойства могут быть определены в 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 , все из которых находятся в System.Web. Пространство имен конфигурации. Чтобы использовать эти свойства профиля, используйте System.Web.Profile.ProfileBase Objects. Свойства профиля не могут быть доступны с помощью профиля . Синтаксис , как упомянуто выше, но это легко сделать, создав экземпляр 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();
8 голосов
/ 21 января 2009

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

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

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

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

2 голосов
/ 08 августа 2012

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

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

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

Code Behind Profile Properties

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

Output

2 голосов
/ 15 декабря 2009

MSDN пошаговое руководство по созданию пользовательского класса (например, метод Джоэла):
http://msdn.microsoft.com/en-us/magazine/cc163624.aspx

1 голос
/ 27 ноября 2015

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

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

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

1 голос
/ 25 октября 2009

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

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

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

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

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

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

0 голосов
/ 15 февраля 2010

Великий пост,

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

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

 </properties>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...