سؤال

طوال حياتي، لا أستطيع جعل SqlProfileProvider يعمل في مشروع MVC الذي أعمل عليه.

أول شيء مثير للاهتمام أدركته هو أن Visual Studio لا يقوم تلقائيًا بإنشاء فئة الوكيل ProfileCommon لك.هذه ليست مشكلة كبيرة نظرًا لأنها مسألة بسيطة تتعلق بتوسيع فئة ProfileBase.بعد إنشاء فئة ProfileCommon، كتبت طريقة الإجراء التالية لإنشاء ملف تعريف المستخدم.

[AcceptVerbs("POST")]
public ActionResult CreateProfile(string company, string phone, string fax, string city, string state, string zip)
{
    MembershipUser user = Membership.GetUser();
    ProfileCommon profile = ProfileCommon.Create(user.UserName, user.IsApproved) as ProfileCommon;

    profile.Company = company;
    profile.Phone = phone;
    profile.Fax = fax;
    profile.City = city;
    profile.State = state;
    profile.Zip = zip;
    profile.Save();

    return RedirectToAction("Index", "Account"); 
}

المشكلة التي أواجهها هي أن استدعاء ProfileCommon.Create() لا يمكن إرساله لكتابة ProfileCommon، لذلك لا أستطيع استعادة كائن ملف التعريف الخاص بي، مما يؤدي بوضوح إلى فشل السطر التالي نظرًا لأن ملف التعريف فارغ.

فيما يلي مقتطف من web.config الخاص بي:

<profile defaultProvider="AspNetSqlProfileProvider" automaticSaveEnabled="false" enabled="true">
    <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" applicationName="/" />
    </providers>
    <properties>
        <add name="FirstName" type="string" />
        <add name="LastName" type="string" />
        <add name="Company" type="string" />
        <add name="Phone" type="string" />
        <add name="Fax" type="string" />
        <add name="City" type="string" />
        <add name="State" type="string" />
        <add name="Zip" type="string" />
        <add name="Email" type="string" >
    </properties>
</profile>

يعمل MembershipProvider دون أي عوائق، لذلك أعلم أن سلسلة الاتصال جيدة.

فقط في حال كان ذلك مفيدًا، فإليك صف ProfileCommon الخاص بي:

public class ProfileCommon : ProfileBase
    {
        public virtual string Company
        {
            get
            {
                return ((string)(this.GetPropertyValue("Company")));
            }
            set
            {
                this.SetPropertyValue("Company", value);
            }
        }

        public virtual string Phone
        {
            get
            {
                return ((string)(this.GetPropertyValue("Phone")));
            }
            set
            {
                this.SetPropertyValue("Phone", value);
            }
        }

        public virtual string Fax
        {
            get
            {
                return ((string)(this.GetPropertyValue("Fax")));
            }
            set
            {
                this.SetPropertyValue("Fax", value);
            }
        }

        public virtual string City
        {
            get
            {
                return ((string)(this.GetPropertyValue("City")));
            }
            set
            {
                this.SetPropertyValue("City", value);
            }
        }

        public virtual string State
        {
            get
            {
                return ((string)(this.GetPropertyValue("State")));
            }
            set
            {
                this.SetPropertyValue("State", value);
            }
        }

        public virtual string Zip
        {
            get
            {
                return ((string)(this.GetPropertyValue("Zip")));
            }
            set
            {
                this.SetPropertyValue("Zip", value);
            }
        }

        public virtual ProfileCommon GetProfile(string username)
        {
            return ((ProfileCommon)(ProfileBase.Create(username)));
        }
    }

أي أفكار حول ما قد أفعله خطأ؟هل نجح أي من البقية في دمج ProfileProvider مع مشاريع ASP.NET MVC الخاصة بك؟

شكرا لكم مقدما...

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

المحلول

إليك ما عليك القيام به:

1) في قسم Web.config، أضف سمة "يرث" بالإضافة إلى إعدادات السمات الأخرى:

<profile inherits="MySite.Models.ProfileCommon" defaultProvider="....

2) إزالة بالكامل <properties> قسم من Web.config، نظرًا لأنك قمت بالفعل بتحديدها في فئة ProfileCommon المخصصة الخاصة بك وتم توجيهك أيضًا للوراثة من فئتك المخصصة في الخطوة السابقة

3) قم بتغيير رمز أسلوب ProfileCommon.GetProfile() الخاص بك إلى

public virtual ProfileCommon GetProfile(string username)        
{            
     return Create(username) as ProfileCommon;      
}

أتمنى أن يساعدك هذا.

نصائح أخرى

لست متأكدًا من السؤال برمته، ولكن هناك شيء واحد لاحظته في شفرتك:

ProfileCommon profile = (ProfileCommon)ProfileCommon.Create(user.UserName, user.IsApproved) as ProfileCommon;

لا تحتاج إلى كل من (ProfileCommon) وProfileCommon.كلاهما يقومان بالإرسال، لكن () يُلقيان والاستثناء بينما يُرجع as قيمة فارغة إذا تعذر إجراء الإرسال.

يحاول منشئ ملفات تعريف الويب.إنه برنامج نصي للإنشاء يقوم تلقائيًا بإنشاء فئة WebProfile (أي ما يعادل ProfileCommon) من web.config.

ملف web.config الموجود في MVC Beta غير صحيح.SqlProfileProvider موجود في System.Web.Profile، وليس System.Web.Security.قم بتغيير هذا، وسيبدأ العمل من أجلك.

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