سؤال

أنا لا أعرف ما أنا في عداد المفقودين ، ولكن أضفت الخصائص الشخصية في شبكة الإنترنت.config ولكن لا يمكن الوصول إلى الملف.البند في قانون أو إنشاء ملف تعريف جديد.

هل كانت مفيدة؟

المحلول

كان لي نفس المشكلة اليوم تعلمت الكثير.

هناك نوعان من المشاريع في Visual Studio -- "موقع ويب المشاريع" و "مشاريع تطبيق ويب." لأسباب غامضة تماما بالنسبة لي ، مشاريع تطبيق ويب يمكن استخدام الملف الشخصي. مباشرة...بقوة كتبته فئة ليست سحرية ولدت من شبكة الإنترنت.config, لذلك عليك أن لفة الخاص بك.

نموذج التعليمة البرمجية في MSDN تفترض كنت تستخدم موقع ويب المشروع ، ويقولون لك مجرد إضافة <profile> قسم Web.config و الطرف مع Profile.الملكية, لكن هذا لا العمل في مشاريع تطبيق ويب.

لديك خيارين لفة الخاص بك:

(1) استخدام ويب الشخصي باني.هذا هو أداة مخصصة إضافة إلى Visual Studio تلقائيا بإنشاء ملف تعريف كائن تحتاج من التعريف الخاص بك في شبكة الإنترنت.config.

اخترت ألا أفعل هذا لأنني لم أكن أريد كود تعتمد على هذه الأداة الإضافية لتجميع الذي يمكن أن يكون تسبب في مشاكل لشخص آخر أسفل الخط عندما حاولوا بناء التعليمات البرمجية دون أن يدركوا أنهم بحاجة إلى هذا أداة.

(2) جعل الخاصة بك فئة مشتقة من ProfileBase لتمثيل التشكيل الجانبي المخصص الخاص بك.هذا هو أسهل مما يبدو.هنا هو بسيط جدا جدا على سبيل المثال أن يضيف "FullName" سلسلة التعريف الميدانية:

في الويب الخاص بك.التكوين:

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

ما سبق يعمل بشكل جيد إذا كنت مرتاحا باستخدام أنواع دينامية ولا مانع من عدم وجود الترجمة لمرة وفحص والتحسس.

إذا كنت تستخدم هذا مع 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.

الشخصية يمكن استخدامها في مشاريع تطبيق ويب أيضا.خصائص يمكن تعريفها في شبكة الإنترنت.التكوين في وقت التصميم أو برمجيا.في شبكة الإنترنت.التكوين:

<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("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) التي يمكن أن تولد فئة لك من التعريف في صفحة ويب.Config.لقد تم استخدام WPB لفترة من الوقت حتى الآن وقد فعلت ما هو متوقع منه.إذا كان لديك الكثير من الخصائص باستخدام WPB يمكنك حفظ قدرا كبيرا من الوقت.
  • تأكد من اتصال قاعدة بيانات تم تكوينه بشكل صحيح في صفحة ويب.Config.
  • الآن يتم تعيين إلى إنشاء مثيل من ملفك الشخصي الطبقة (في وحدة تحكم)
  • سوف تحتاج على الأرجح ملف قيم العقارات في وجهات النظر الخاصة بك.أود أن تمرير كائن ملف تعريف نفسها على طول إلى عرض (ليس الخصائص الفردية).

إذا كنت تستخدم مشروع تطبيق ويب، لا يمكنك الوصول إلى الكائن الملف في وقت التصميم خارج مربع. هنا هو الأداة التي من المفترض أن يفعل لك: <لأ href = "http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects. ASPX "يختلط =" نوفولو noreferrer "> 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.config كما يلي: -

والآن، كتابة التعليمات البرمجية التالية: -

وترجمة وتشغيل التعليمات البرمجية. سوف تحصل على ما يلي الإخراج: -

على ويب الشخصي باني عملت كبيرة بالنسبة لي.الطبقة التي ولدت لديها الكثير أكثر من ذلك في وصفها جويل آخر.ما إذا كان أو لم يكن في الواقع هناك حاجة أو فائدة أنا لا أعرف.

على أي حال لأولئك الذين يبحثون عن وسيلة سهلة لتوليد الطبقة ، ولكن لا يريد أن يكون خارجي بناء أداة التبعية يمكنك دائما

  • استخدام شبكة الإنترنت الشخصي باني
  • حذف كل أثر من ذلك!
  • الاستمرار في استخدام الشخصي الذي تم إنشاؤه الدرجة

أو (لم تختبر ولكن قد تعمل فقط)

  • إنشاء صفحة ويب الموقع المشروع
  • إنشاء عنصر
  • المفاجئة الفئة التي تم إنشاؤها ونسخها إلى الويب الخاص بك المشروع المشروع

إذا كان هذا النهج الثاني يعمل شخص ما يمكن أن اسمحوا لي أن أعرف للرجوع إليها في المستقبل

ونريد فقط أن أضيف إلى الجواب جويل سبولسكي ل

وأنا نفذت حل له، والعمل ببراعة راجع للشغل - 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(); }
        }
    }
}

وتعمل مثل السحر ...

وظيفة كبيرة،

ومجرد ملاحظة على الملف web.config إذا كنت لا تحدد السمة وراثة في العنصر الشخصي سوف تحتاج إلى تحديد كل الممتلكات الشخصية indiviudal داخل الملف الشخصى العنصر في الملف web.config على النحو التالي

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

 </properties>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top