Пожалуйста, воздержитесь от моего noobness, я супер новичок в шаблоне MVC.
Что я пытаюсь сделать
Я создаю страницу профиля для зарегистрированных пользователей на моем сайте. На этой странице будут перечислены данные о пользователе, такие как дата рождения, номер телефона, статус подписки и т.д. Вы получите эту идею. Я также хотел бы иметь форму, позволяющую пользователям изменять свой пароль, адрес электронной почты, личную информацию на той же странице.
Моя проблема
Пользовательские данные поступают от моего контроллера через переданную переменную модели:
public ActionResult Profil()
{
var model = db.Users.First(e => e.UserName == WebSecurity.CurrentUserName);
return View(model);
}
Результат выглядит следующим образом:
<label>Phone number: </label>
@if (Model.PhoneNumber != null)
{
@Model.PhoneNumber
}
else
{
<span class="red">You haven't set up your phone number yet. </span>
}
Форма, в которой пользователь может изменить свою информацию, будет использовать другую модель ProfileModel. Итак, basiccaly мне нужно использовать две модели, на мой взгляд, одну для вывода информации и одну для публикации данных. Я думал, что с помощью частичного представления я могу это сделать, но получаю эту ошибку:
Элемент модели, переданный в словарь, имеет тип "Applicense.Models.User", но для этого словаря требуется элемент модели type 'Applicense.Models.ProfileModel'.
Вот как выглядит мой вызов частичного вида:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary()
@Html.Partial("_ModifyProfileInfo")
}
Здесь частичный вид:
@model Applicense.Models.ProfileModel
<ul>
<li>
@Html.LabelFor(m => m.Email)
@Html.EditorFor(m => m.Email)
</li>
<li>
@Html.LabelFor(m => m.ConfirmEmail)
@Html.EditorFor(m => m.ConfirmEmail)
</li>
<input type="submit" value="Update e-mail" />
</ul>
И, наконец, здесь мой ProfileModel:
public class ProfileModel
{
[Required]
[DataType(DataType.EmailAddress)]
[Display(Name = "New e-mail address")]
public string Email { get; set; }
[DataType(DataType.EmailAddress)]
[Display(Name = "Confirm new e-mail address")]
[Compare("Email", ErrorMessage = "The e-mail and it confirmation field do not match.")]
public string ConfirmEmail { get; set; }
}
Я что-то упустил? Каков правильный способ сделать это?
Edit: Я переделаю свой код, отражающий ответ Никола Митев, но теперь у меня другая проблема. Вот ошибка, которую я получаю:
Ссылка на объект не установлена в экземпляр объекта. (@Model.UserObject.LastName)
Это происходит только тогда, когда я отправляю измененные значения адресов электронной почты. Здесь моя ViewModel (ProfileModel.cs):
public class ProfileModel
{
public User UserObject { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
[Display(Name = "Új e-mail cím")]
public string Email { get; set; }
[DataType(DataType.EmailAddress)]
[Display(Name = "Új e-mail cím megerősítése")]
[Compare("Email", ErrorMessage = "A két e-mail cím nem egyezik.")]
public string ConfirmEmail { get; set; }
[DataType(DataType.EmailAddress)]
[Display(Name= "E-mail cím")]
public string ReferEmail { get; set; }
}
Контроллер:
public ActionResult Profil()
{
var User = db.Users.First(e => e.UserName == WebSecurity.CurrentUserName);
var ProfileViewModel = new ProfileModel
{
UserObject = User
};
return View(ProfileViewModel);
}
И, наконец, мой класс user.cs
:
[Table("UserProfile")]
public class User
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
[Column("UserName")]
public string UserName { get; set; }
[Column("Email")]
[Required]
public string Email { get; set; }
[Column("FirstName")]
public string FirstName { get; set; }
[Column("LastName")]
public string LastName { get; set; }
[Column("PhoneNumber")]
public string PhoneNumber { get; set; }
... You get the idea of the rest...
Я думаю, что это происходит, потому что модель пытается помещать данные в каждый столбец required
в базу данных.
Edit2: Метод httppost моего действия Profil:
[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public ActionResult Profil(ProfileModel model)
{
if (ModelState.IsValid)
{
//insert into database
return Content("everything good");
}
else
{
//outputs form errors
return View(model);
}
}