Lütfen noobness numaramdan ayırarak MVC modeline çok yeniyim. Ben sitemde kayıtlı kullanıcılar için bir profil bilgileri sayfası inşa ediyorumMVC 4 - Kısmi görünümde farklı bir model kullanın
yapmaya çalışıyorum ne
. Bu sayfa kullanıcının doğum tarihi, telefon numarası, abonelik durumu vb. Ile ilgili verilerini listeleyecektir. Aynı zamanda kullanıcıların parolalarını, e-posta adreslerini ve kişisel bilgilerini aynı sayfada değiştirmelerini sağlamak için bir form olmasını isterim.
Benim sorunum kullanıcının veri geride bırakmış modeli değişkeni yoluyla benim denetleyicisi geliyor
:
public ActionResult Profil()
{
var model = db.Users.First(e => e.UserName == WebSecurity.CurrentUserName);
return View(model);
}
çıktı Bence şöyle :
<label>Phone number: </label>
@if (Model.PhoneNumber != null)
{
@Model.PhoneNumber
}
else
{
<span class="red">You haven't set up your phone number yet. </span>
}
formu Kullanıcının bilgisini değiştirebileceği başka bir model olan ProfileModel kullanırdı. Bu yüzden temel bilgilerim, biri bilgi çıkışı için ve veri göndermek için bir tane olmak üzere iki model kullanmam gerekiyor.
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary()
@Html.Partial("_ModifyProfileInfo")
}
İşte kısmi görünümü var:
İşteThe model item passed into the dictionary is of type 'Applicense.Models.User', but this dictionary requires a model item of type 'Applicense.Models.ProfileModel'.
gibi kısmi görünümüne çağrım görünüyor:
Ben kısmi görünümünü kullanarak bunu elde edebilirsiniz, ama bu hatayı alıyorum düşündümpublic 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's confirmation field do not match.")]
public string ConfirmEmail { get; set; }
}
: sonunda burada @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>
Ve benim ProfileModel var
Bir şey mi eksik? Bunu yapmanın doğru yolu nedir?
Düzenleme: Kodumu Nikola Mitev'in yanıtını yansıtan bir remotum var, ama şimdi başka bir sorunum var. Benim elde hata var: Ben değiştirilen e-mail adresi değerleri gönderme olduğumda
Object reference not set to an instance of an object. (@Model.UserObject.LastName)
Bu yalnızca oluşur. İşte benim ViewModel (ProfileModel.cs) var:
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; }
}
Denetleyici: sonunda burada
public ActionResult Profil()
{
var User = db.Users.First(e => e.UserName == WebSecurity.CurrentUserName);
var ProfileViewModel = new ProfileModel
{
UserObject = User
};
return View(ProfileViewModel);
}
Ve olması benim user.cs
modeli sınıfı:
[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...
manken olduğu için oluyor düşünüyorum Her bir required
sütununa veriyi veritabanına koymaya çalışıyor.
Edit2: benim profile eylem HttpPost yöntemi:
Kumandanızda tanımlandığı haliyleViewData
göndermenizi sağlar @Html.Partial
bir aşırı yük vardır [HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public ActionResult Profil(ProfileModel model)
{
if (ModelState.IsValid)
{
//insert into database
return Content("everything's good");
}
else
{
//outputs form errors
return View(model);
}
}
teşekkür ederiz sizin için hazır hale bir cazibe gibi çalışır! :) Çok iyi yazılmış cevap için de +1. – PeterInvincible
Şimdi başka bir hata alıyorum :(Soruyu yanıtlamak için onu düzenledim – PeterInvincible
@Tharline Getirmeye çalıştığınız belirli bir kaydın LastName alanında değeri var mı? –