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


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

10 110

10 ответов:

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

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

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

у вас есть два варианта, чтобы свернуть свой собственный:

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

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

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

в вашей сеть.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 и присутствует во время выполнения.

самый простой способ добраться до объекта-использовать динамический тип, как показано ниже.

в Интернете.конфигурационный файл объявляет свойства профиля:

<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.Сеть.Профиль.ProfileBase.

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

профиль можно использовать и в проектах веб-приложений. Свойства могут быть определены в Интернете.конфигурация во время разработки или программно. в 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, все из которых находятся в системе.Сеть.Пространство Имен Конфигурации. Чтобы использовать эти свойства профиля, используйте систему.Сеть.Профиль.Объекты ProfileBase. Свойства профиля не могут быть доступны с помощью профиль. синтаксис, как упоминалось выше, но может быть легко сделано путем создания экземпляра ProfileBase и с помощью SetPropertyValue("Имя_свойства") и GetPropertyValue {"Имя_свойства") следующим образом:

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 рамки.
  • напишите класс, производный от ProfileGroupBase, или установите Web Profile Builder (WPB), который может генерировать класс для вас из определения в Web.Конфиг. Я использовал ДСП и до сих пор он сделал то, что от него ожидают. Если у вас много свойств, использование WPB может сэкономить довольно много времени.
  • убедитесь, что подключение к базе данных правильно настроено в Web.Конфиг.
  • теперь вы настроены на создание экземпляра вашего профильного класса (в контроллере)
  • вероятно, вам понадобятся значения свойств профиля в ваших представлениях. Мне нравится передавать сам объект профиля в представление (а не отдельные свойства).

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

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

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

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

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

Code Behind Profile Properties

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

Output

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

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

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

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

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

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

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

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

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

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

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

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

 </properties>