Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

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

(2) Создайте собственный класс, производный от ProfileBase, для представления вашего пользовательского профиля. Это проще, чем кажется. Вот очень простой пример, который добавляет & Quot; FullName & Quot; строковое поле профиля:

В вашем 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;

Другие советы

Проекты веб-приложений могут по-прежнему использовать объект 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 плохо работают с " model " ; объекты, которые являются динамическими. Вам нужно будет присвоить свойства профиля статически типизированным переменным, прежде чем передавать их вспомогательным методам 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.

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

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

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

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

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

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

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

Укажите свойства в файле web.config следующим образом: - ProfilePropertyWeb.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(); }
        }
    }
}

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

Отличный пост,

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

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

 </properties>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top