Si prega di sopportare il mio noobness, sono super nuovo al pattern MVC.MVC 4 - Utilizzare un modello diverso in vista parziale
Quello che sto cercando di fare
Sto costruendo una pagina informazioni del profilo per gli utenti registrati sul mio sito. Questa pagina dovrebbe elencare i dati sull'utente, come la data di nascita, il numero di telefono, lo stato dell'abbonamento, ecc. Si ottiene l'idea. Mi piacerebbe anche avere un modulo per consentire agli utenti di cambiare la loro password, indirizzo e-mail, informazioni personali sulla stessa pagina.
Il mio problema
dati dell'utente viene dal mio controller tramite una variabile del modello passato:
public ActionResult Profil()
{
var model = db.Users.First(e => e.UserName == WebSecurity.CurrentUserName);
return View(model);
}
L'output è simile al seguente a mio avviso:
<label>Phone number: </label>
@if (Model.PhoneNumber != null)
{
@Model.PhoneNumber
}
else
{
<span class="red">You haven't set up your phone number yet. </span>
}
La forma in cui l'utente poteva modificare le sue informazioni avrebbe utilizzato un altro modello, ProfileModel. Quindi, a mio avviso, ho bisogno di utilizzare due modelli a mio avviso, uno per l'output delle informazioni e uno per la pubblicazione dei dati. Ho pensato che l'utilizzo di una vista parziale posso raggiungere questo obiettivo, ma ottengo questo errore:
The model item passed into the dictionary is of type 'Applicense.Models.User', but this dictionary requires a model item of type 'Applicense.Models.ProfileModel'.
Ecco cosa la mia chiamata alla vista parziale assomiglia:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary()
@Html.Partial("_ModifyProfileInfo")
}
Ecco la vista parziale:
@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>
E infine ecco il mio 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's confirmation field do not match.")]
public string ConfirmEmail { get; set; }
}
Mi manca qualcosa? Qual è il modo corretto per farlo?
Modifica: Ho rifatto il mio codice riflettendo la risposta di Nikola Mitev, ma ora ho un altro problema. Ecco l'errore che ottengo:
Object reference not set to an instance of an object. (@Model.UserObject.LastName)
Ciò si verifica solo quando sto postando i valori degli indirizzi di posta elettronica modificati. Ecco il mio 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; }
}
Controller:
public ActionResult Profil()
{
var User = db.Users.First(e => e.UserName == WebSecurity.CurrentUserName);
var ProfileViewModel = new ProfileModel
{
UserObject = User
};
return View(ProfileViewModel);
}
E infine ecco la mia classe user.cs
modello:
[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...
Sto pensando che sta accadendo perché il modello è cercando di inserire i dati in ciascuna colonna required
nel database.
Edit2: Il metodo HttpPost della mia azione Profil:
[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);
}
}
Grazie, funziona come un fascino! :) +1 anche per la risposta molto ben scritta. – PeterInvincible
Ho un altro errore ora :(Ho modificato la domanda per rispecchiarlo – PeterInvincible
@Tharline il tuo particolare record che cerchi di recuperare ha valore nel campo LastName? –