2013-01-22 16 views
6

Ho un semplice modulo di modifica per un modello utente, ma quando registro, nessuno dei valori di input nascosti viene applicato al modello e non sono sicuro del motivo per cui questo sta accadendo.MVC post non aggiunge valori al modello

mio rasoio:

@model CMS.Core.Models.UserProfile 

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 

    <fieldset class="normalForm"> 
     <legend>User Profile</legend> 

     @Html.HiddenFor(model => model.UserId) 

     <div class="formRow"> 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.EmailAddress) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(model => model.EmailAddress, new { @class = "textbox" }) 
       @Html.ValidationMessageFor(model => model.EmailAddress) 
      </div> 
     </div> 

     <div class="formRow"> 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.FirstName) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(model => model.FirstName, new { @class = "textbox" }) 
       @Html.ValidationMessageFor(model => model.FirstName) 
      </div> 
     </div> 

     <div class="buttonRow"><input type="submit" value="Save" class="button" /></div> 
    </fieldset> 
} 

mio controller: class

[HttpPost] 
    public ActionResult Edit(UserProfile user) 
    { 
     if (ModelState.IsValid) 
     { 
      user.Save(); 
      return RedirectToAction("Index"); 
     } 
     return View(user); 
    } 

ProfiloUtente:

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; private set; } 


    [Required(ErrorMessage = "Please enter an email address")] 
    [StringLength(350)] 
    [DataType(DataType.EmailAddress)] 
    [Display(Name = "Email Address")] 
    public string EmailAddress { get; set; } 


    [StringLength(100)] 
    [DataType(DataType.Text)] 
    [Display(Name = "First Name")] 
    public string FirstName { get; set; } 
} 

Se provo user.UserId restituisce zero (in quanto è un int), ma se Provo Request["UserId"] restituisce il valore corretto in modo che il valore venga pubblicato correttamente - Appena aggiunto al modello UserProfile. Qualcuno sa perché questo sta accadendo o che cosa posso fare per risolverlo

Grazie

+0

Come è generato l'aspetto HTML per il campo nascosto? Puoi anche pubblicare il tuo modello UserProfile? – nemesv

+0

Pete

+1

L'HTML generato sembra soddisfacente. Quindi puoi aggiornare il tuo post con la definizione della tua classe 'UserProfile'? – nemesv

risposta

7

L'DefaultModelBinder solo in grado di legare proprietà pubbliche.

Cambia la tua setter proprietà pubblica e dovrebbe funzionare bene:

[Key] 
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
public int UserId { get; set; } 

Se non si può fare che è necessario creare un modello personalizzato legante che si occupa di setter privati.

Tuttavia come approccio migliore invece di utilizzare direttamente lo UserProfile. Crea un UserProfileViewModel dove il tuo UserId è pubblico e lo usi nell'azione Visualizza e Controller. In questo caso devi mappare tra il tuo UserProfile e il UserProfileViewModel ma esistono buoni strumenti per tale attività come AutoMapper.

+0

Questa è la risposta. Impossibile usare ** set privato ** in questo contesto. –

+0

geniale, grazie! – Pete

1

Come @nemesev ha detto, le proprietà di accesso sulle proprietà del modello devono essere pubblico.

Per evitare di dover hackerare la classe del database per far funzionare il binding del modello, è necessario creare un modello per tale classe, quindi non è necessario utilizzare il DTO nella vista (che non è è l'ideale).

Problemi correlati