Профиль объекта + Просмотр модели + Обновление профиля пользователя MVC C#
Проблема: я создал собственный объект профиля, как описано здесь Джоэлом. Затем я использовал метод Джереми ( здесь), чтобы расширить пользовательский профиль, чтобы я мог сгенерировать пользователя и установить эти значения. Затем я создал 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:
[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);
}
Как вы можете видеть, я использую модель представления для отображения вида. Модель просмотра это:
public class UserViewModel
{
public UserInformation UserInf{ get; set; }
public ProfileInformation Profile { get; set; }
}
И, наконец, метод HttpPost для обновления UserProfile:
[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 (пользовательский объект профиля), но говорит, что не может найти объект... Я думаю, это потому, что у него нет профиля для обновления... но я не могу добраться до ошибки до того, как она появится... так расстраивает! Любая помощь будет принята с благодарностью!!! Спасибо, что нашли время, чтобы проверить это.
Я также оставлю вас с моим методом Register, который успешно использует пользовательский объект Profile и даже обновляет свойство name до "ScoobyDoo" для целей тестирования:)
[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);
}
1 ответ
Возможно, вам потребуется предоставить собственную реализацию профиля... Если вы сделали это, добавили ли вы свой тип настраиваемого провайдера в ваш файл "web.config"?
Пример:
<profile defaultProvider="TableProfileProvider" enabled="true" inherits="YourNamespace.YourClass, YourNamespace">
Отличная статья MSDN здесь, здесь и здесь.
Я надеюсь, что это поможет вам!