2011-09-26 8 views
15

Ho creato una vista a rasoio MVC3 fortemente tipizzata utilizzando il codice scaffolding.MVC3 Html.HiddenFor (Modello => Model.Id) non ritorno al controller

Il modello è un POCO con un tipo di base PersistentEntity che definisce una proprietà denominata Creato, Aggiornato e Id.

Id è un int, creato e aggiornato è DateTime.

Sto usando Html.HiddenFor per creare il campo nascosto sulla vista.

@Html.HiddenFor(model => model.Id) 
@Html.HiddenFor(model => model.Created) 
@Html.HiddenFor(model => model.Updated) 

Nella pagina, l'input nascosto viene reso correttamente, con l'ID impostato nel valore.

<input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Id" name="Id" type="hidden" value="12"> 

Tuttavia quando la pagina viene sottoposto al controllo [HttpPost]Edit(Model model) la proprietà Id è sempre 0. creati e aggiornati siano correttamente compilato con i valori della vista.

enter image description here

Questo dovrebbe essere 12 nel caso dell'esempio in questo post. Cosa sta andando storto?


Sono consapevole che posso cambiare la firma del metodo per [HttpPost]Edit(int personID, Person model) come il PersonID è nella stringa di ottenere, però perché il modello non ottiene popolato con il campo nascosto?


Aggiornamento

Il problema era che il setter sul PersistentEntity era protetta, ASP non ha potuto impostare la proprietà, e la inghiottì. Cambiare questo in pubblico ha risolto il problema.

public abstract class PersistentEntity 
{ 
    public virtual int Id { get; protected set; } 
    public virtual DateTime Created { get; set; } 
    public virtual DateTime Updated { get; set; } 
} 
+1

Questo dovrebbe funzionare. Hai controllato il contructor e l'organizzatore della proprietà per l'Id nella tua classe? – Dabblernl

+1

Funziona per me, quindi ci manca qualcosa che non è menzionato in questione: raccoglitori personalizzati, modulo JavaScript personalizzato inviato, qualcosa del genere ... – Giedrius

+1

Come appare la classe del modello contenente la proprietà Id? –

risposta

14
public virtual int Id { get; protected set; } 

protected set;<!-- Questo è il tuo problema. È necessario un setter pubblico se si desidera che il raccoglitore modello predefinito sia in grado di assegnare il valore.

+0

Sì, questo era il problema, grazie per il tuo aiuto. – Darbio

+1

Se stai guardando questo post e hai già un setter pubblico sul tuo POCO, potresti trovare utile questo post: http://stackoverflow.com/questions/3606087/why-mvc-html-hiddenfor-does-not -render-my-campo – gb2d

Problemi correlati