6

問題: Joel の説明に従って、カスタム プロファイル オブジェクトを作成しまし。次に、Jeremy のメソッド ( here ) を使用してカスタム プロファイルを拡張し、ユーザーを生成してそれらの値を設定できるようにしました。次に、ユーザーがメンバーシップ情報 (電子メール) とプロファイル情報を更新できるように、メンバーシップ情報とプロファイル情報を表示する ViewModel を作成しました。**ビューには、ビューの更新情報に入力したすべてのフィールドが表示され、[保存] をクリックすると、次のエラーが表示されます

System.Configuration.SettingsPropertyNotFoundException: 設定プロパティ 'FirstName' が見つかりませんでした。**

これが私のカスタム プロファイル オブジェクト (モデル) です。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Profile;
using System.Web.Security;


namespace NDAC.Models
{
    public class ProfileInformation : ProfileBase
    {
        static public ProfileInformation CurrentUser
        {
            get
            {
                if (Membership.GetUser() != null)
                {
                     return (ProfileInformation)(ProfileBase.Create(Membership.GetUser().UserName));
                }
                else
                {
                    return null;
                }
            }
        }

        public virtual string FirstName {
            get
            {

                return ((string)(base["FirstName"]));
            }
            set 
            {
                base["FirstName"] = value; Save();
            } 
        }
        public virtual string LastName {
            get 
            {
                return ((string)(base["LastName"]));
            }
            set 
            {
                base["LastName"] = value; Save();
            }
        }
        public string Street 
        {
            get 
            {
                return ((string)(base["Street"]));
            }
            set 
            {
                base["Street"] = value; Save();
            }
        }
        public string Street2 
        { 
            get 
            {
                return ((string)(base["Street2"]));
            }
            set 
            {
                base["Street2"] = value; Save();
            }
        }
        public string City 
        {
            get 
            {
                return ((string)(base["City"]));
            }
            set 
            {
                base["City"] = value; Save();
            }
        }
        public string State 
        {
            get 
            {
                return ((string)(base["State"]));
            }
            set 
            {
                base["State"] = value; Save();
            }
        }
        public string ZipCode 
        {
            get 
            {
                return ((string)(base["ZipCode"]));
            }
            set 
            {
                base["ZipCode"] = value; Save();
            }
        }
        public string PhoneNumber 
        {
            get 
            {
                return ((string)(base["PhoneNumber"]));
            }
            set 
            {
                base["PhoneNumber"] = value; Save();
            }
        }
        public string SemesterID 
        {
            get 
            {
                return ((string)(base["SemesterID"]));
            }
            set 
            {
                base["SemesterID"] = value; Save();
            }
        }

        static public  ProfileInformation GetProfile(string username)
        {
            return Create(username) as ProfileInformation;
        }

        internal static ProfileInformation NewUser
        {
            get { return System.Web.HttpContext.Current.Profile as ProfileInformation; }
        }

    }
}

UserProfile Get メソッドは次のとおりです。

[Authorize]
        public ActionResult UserProfile()
        {
            string id = User.Identity.Name.ToString();
            MembershipUser user = Membership.GetUser(id);

           var model = new UserViewModel();

            UserInformation userInf = new UserInformation();
            userInf.Username = user.UserName;
            userInf.Email = user.Email;

            ProfileInformation currentProfile = ProfileInformation.GetProfile(user.UserName);

            model.Profile = currentProfile;
            model.UserInf = userInf;    

            return View(model);

        }

ご覧のとおり、View Model を使用してビューを表示しています。ビューモデルは次のとおりです。

 public class UserViewModel
    {

        public UserInformation UserInf{ get; set; }
        public ProfileInformation Profile { get; set; }


    }

最後に、Update UserProfile の HttpPost メソッドは次のとおりです。

[Authorize]
        [HttpPost]
        public ActionResult UserProfile(UserViewModel model)
        {
            ProfileInformation currentProfile = ProfileInformation.GetProfile(User.Identity.Name.ToString());

            ProfileInformation.CurrentUser.FirstName = model.Profile.FirstName;
            currentProfile.LastName = model.Profile.LastName;
            currentProfile.Street = model.Profile.Street;
            currentProfile.Street2 = model.Profile.Street2;
            currentProfile.City = model.Profile.City;
            currentProfile.State= model.Profile.State;
            currentProfile.ZipCode = model.Profile.ZipCode;
            currentProfile.PhoneNumber = model.Profile.PhoneNumber;
            currentProfile.Save();

            MembershipUser user = Membership.GetUser(User.Identity.Name.ToString());
            user.Email = model.UserInf.Email;
            Membership.UpdateUser(user);


            TempData["SuccessMessage"] = "Your Profile information has been saved";
            ViewBag.Title = "My Profile";
            return RedirectToAction("ProfileUpdated");
        }

問題は、エラーがどこから来ているのかわからないことです。フォームがレンダリングされ、有効な情報を入力すると、「設定プロパティ 'FirstName' が見つかりませんでした」と表示されます。UserViewModel が ProfileInformation.cs (カスタム プロファイル オブジェクト) を更新しようとしているようですが、オブジェクトが見つからないと言っています...更新するプロファイルがないためだと思います...しかし、私は投稿する前にエラーに到達できません...とてもイライラします!どんな助けでも大歓迎です!!! これをチェックするために時間を割いていただきありがとうございます。

また、カスタム Profile オブジェクトを正常に使用し、テスト目的で name プロパティを「ScoobyDoo」に更新する Register メソッドも残します :)

[HttpPost]
        public ActionResult Register(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
                // Attempt to register the user
                MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Password, model.Email, model.SecretQuestion, model.SecretAnswer);

                if (createStatus == MembershipCreateStatus.Success)
                {

                    FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
                    Roles.AddUserToRole(model.UserName, "Student");
                    ProfileInformation.NewUser.Initialize(model.UserName, true);
                    ProfileInformation.NewUser.Save();

                    string currentSemesterID = CurrentSemester;
                    ProfileInformation profile = ProfileInformation.GetProfile(model.UserName);
                    profile.SemesterID = currentSemesterID;
                    profile.FirstName = "ScoobyDoo";

                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus));
                }
            }

            // If we got this far, something failed, redisplay form
            ViewBag.PasswordLength = MembershipService.MinPasswordLength;
            return View(model);
        }
4

1 に答える 1

1

独自のプロファイルの実装を提供する必要がある場合があります...それを行った場合、カスタム プロバイダーの種類を "web.config" に追加しましたか?

例:

<profile defaultProvider="TableProfileProvider" enabled="true" inherits="YourNamespace.YourClass, YourNamespace">

MSDN の優れた記事は、ここここ、およびここにあります。

これらがあなたの道に役立つことを願っています!

于 2011-03-16T16:48:49.790 に答える