2010-10-21 29 views
0

Je le modèlemodèle Bind retour lors de l'affichage avec le modèle DisplayFor

public class PersonViewModel 
{ 
    public Guid Id { get; set; } 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
} 

qui est niché dans un autre modèle de vue:

public class ApprovalModel 
{ 
    [UIHint("MyDisplayTemplate")] 
    public PersonViewModel User { get; set; } 

    [Required] 
    public bool? Approve { get; set; } 
} 

Sous Vues -> Partagé -> DisplayTemplates je le modèle Dans ma vue ApprovalModel J'utilise la ligne suivante, qui affiche le modèle imbriqué:

MyDisplayTemplate.ascx
<div class="display-field"> <%: Html.DisplayFor(model => model.User) %> </div> 

Et dans mon contrôleur j'ai l'action

[HttpPost] 
public virtual ActionResult ApproveRequest(ApprovalModel vm) 
{ 
    //access bound vm.User here 
} 

est-il un moyen simple de lier le modèle imbriqué retour à la demande de poste? Ou quoi d'autre puis-je faire pour le lier?

grâce

Répondre

2

Enregistrez votre modèle de vue dans Session et restaurez l'ID en tant que champ masqué. Ensuite, votre action de publication peut récupérer le modèle à partir de la session ou le charger par l'identifiant s'il n'y figure pas.

Vue:

<%: Html.HiddenFor(x => x.Id) %> 

Controller:

[HttpPost] 
public virtual ActionResult ApproveRequest(int id) 
{ 
    //access bound vm.User here 
} 
2

Vous avez besoin champs d'entrée dans le modèle d'affichage:

<%: Html.HiddenFor(x => x.Id) %> 
<%: Html.LabelFor(x => x.Firstname) %> 
<%: Html.TextBoxFor(x => x.Firstname) %> 
<br/> 
<%: Html.LabelFor(x => x.Lastname) %> 
<%: Html.TextBoxFor(x => x.Lastname) %> 

Et dans votre action du contrôleur indique le préfixe de l'utilisateur afin que le modèle de liaison est capable de reconnaître correctement les valeurs de demande et les liant à ApprovalModel.

[HttpPost] 
public ActionResult ApproveRequest([Bind(Prefix = "User")] ApprovalModel vm) 

modèles de l'éditeur semble également plus approprié (<%: Html.EditorFor(model => model.User) %>) pour générer des formes et des champs d'entrée au lieu de modèles d'affichage.

+0

mais je ne souhaite pas modifier les champs. Je veux les afficher et les réutiliser sur l'action de publication – Fabiano

+1

Sans les champs de saisie, vous ne récupérerez pas les valeurs dans l'action du contrôleur. Lorsque vous utilisez 'ApprovalModel' comme paramètre d'action, il recherche les valeurs passées dans la requête. Vous pouvez également les inclure en tant que champs masqués dans votre formulaire si vous ne souhaitez pas que ces champs de saisie soient visibles, mais que les valeurs doivent être envoyées au serveur d'une manière ou d'une autre. –

1

Vous n'avez pas besoin de mettre les fileds dans les zones de texte que vous avez juste besoin de mettre dans certains champs d'entrée, Ainsi, lorsque la page est publiée, ces valeurs sont renvoyées au serveur. Par conséquent, utilisez simplement HiddenFor (....) pour chaque champ que vous souhaitez récupérer à la publication