2009-11-23 5 views
1

J'ai un site Web qui utilise une méthode Action qui transmet un nom de page à la méthode get action. Dans la méthode d'action, il trouve l'élément de modèle par le nom de page et renvoie les données pertinentes à la vue.ASP.Net MVC - Fusionner modèle et formcollection en objet pour passer à une vue

J'ai maintenant créé une méthode d'action POST pour cela parce que j'en ai besoin dans ma page de contact. Je dois toujours trouver le modèle par nom de page et le retourner à la vue mais quand l'utilisateur soumet les informations de contact, je fais un TryUpdateModel sur mon élément de modèle Inquiry et s'il n'est pas valide il renvoie les erreurs dans le modelstate et le résumé de validation montre le erreurs, mais aucune des informations qu'ils ont soumises n'est restituée.

Y at-il de toute façon que je puisse renvoyer le modèle de page et obtenir les zones de texte pour restituer ce qu'ils avaient précédemment tapé quand le modèle échoue?

Répondre

0

Voici ce que nous faisons (avec des choses non essentielles à cette question enlevé):

private ModelType UpdateModel(Guid id) 
{ 
    var dbData = (from m in Repository.SelectAll() 
        where m.Id == id 
        select new ModelType 
        { 
         Id = m.Id, 
         Data = m.Data 
        }).First(); 
    return UpdateModel(dbData); 
} 

private ModelType UpdateModel(ModelType model) 
{ 
    //add other data for view: 
    model.SelectStuff = new SelectList(//... 
    // etc. 
    return model; 
} 

[HttpGet] 
public ActionResult Update(Guid id) 
{ 
    return View(UpdateModel(id)); 
} 

[HttpPost] 
public ActionResult Update(ModelType model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(UpdateModel(model)); 
    } 
    // else post to repository 
} 
0

Si vous ajoutez une propriété à votre modèle de vue pour ce qui devrait être lié à la zone de texte (dans mon exemple Thing), vous pouvez utiliser quelque chose comme:

<%=Html.TextBox("Thing", Model.Thing != null ? Model.Thing : string.Empty) 

Bonté,

Dan

+0

Je voulais éviter d'avoir un modèle séparé Voir de mon modèle DB, mais je pense est le seul remède approche disponible – Jon

+0

Je pense que vous avez raison; vous allez avoir besoin d'un modèle de vue dans ce cas. Gentillesse, Dan –

0

je travaillais que je pouvais utiliser l'approche suivante:

<input name="ENQ.Name" class="inputText" type="text" maxlength="150" title="Please enter your name" value="<%= ViewData.ModelState["ENQ.Name"] != null ? ViewData.ModelState["ENQ.Name"].Value.AttemptedValue : "" %>" /> 
Questions connexes