2009-12-12 3 views
0

J'utilise MVC pour créer quelques pages CRUD simples. J'ai un contrôle utilisateur stringly typé que j'inclure dans mes Créer et Éditer les qui ressemble à ceci:MVC ne rend pas les propriétés du modèle dans la zone de texte

<% using (Html.BeginForm()) {%> 
<div class="form"> 
    <%:this.Model.Title%> 
    <p> 
     <label for="Title">Title:</label> 
     <%= Html.TextBox("Title", this.Model.Title) %> 
     <%= Html.ValidationMessage("Title", "*") %> 
    </p> 
    <p> 
     <label for="Summary">Summary:</label> 
     <%= Html.TextBox("Summary", this.Model.Summary)%> 
     <%= Html.ValidationMessage("Summary", "*") %> 
    </p> 
    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</div> 
<% } %> 

..un Créer une action qui ressemble à ceci:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(string title, string summary) 
{ 
    Tour tour = this.TourManager.CreateTour(string.IsNullOrEmpty(title) ? DefaultText.TourTitle : title, string.IsNullOrEmpty(summary)? DefaultText.TourSummary : summary); 
    return this.View("Edit", tour); 
} 

... et un action Edit qui ressemble à ceci:

public ActionResult Edit(int id) 
{ 
    Tour tour = this.TourManager.GetTour(id); 
    return this.View("Edit", tour); 
} 

le problème que je vais avoir est que <%= Html.TextBox("Title", this.Model.Title) %> n'est pas rendu le texte à l'intérieur du champ de saisie. <%:this.Model.Title%> le rend très bien, donc je sais que le modèle est peuplé. Cela se produit uniquement lorsque la vue est renvoyée à partir de l'action Créer (avec une URL de/MyEntity/Create). Lorsque vous appelez l'action Edit avec une URL ressemblant à/MyEntity/Edit/1, le texte s'affiche correctement dans la zone de texte. Les deux actions transmettent un modèle rempli à la vue d'édition, donc je ne comprends pas pourquoi cela se produit.

Répondre

3

Je veux vous suggérer d'utiliser le modèle Post/Redirect/Get. post action devrait être:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(string title, string summary) 
{ 
    Tour tour = this.TourManager.CreateTour(string.IsNullOrEmpty(title) ? DefaultText.TourTitle : title, string.IsNullOrEmpty(summary)? DefaultText.TourSummary : summary); 
    return RedirectToAction("Edit", new { id = tour.id }); 
} 

Votre problème est propably connecté à ModelState peuplée, ce qui est vide, parce que vous n'avez pas utilisé la redirection. Les assistants MVC utilisent des valeurs provenant de ModelState peuplé, même si vous les avez dans le modèle spécifié.

+0

La raison pour laquelle je n'avais pas fait cela était parce que j'ai un test unitaire qui affirme que l'action Créer place les valeurs par défaut dans le modèle. Un RedirectToRouteResult ne contient pas le modèle, il est donc difficile pour moi de le tester. – Charlie

+0

Ce n'est pas une bonne raison. Vous devriez vérifier ces valeurs par défaut dans les tests TourManager.CreateTour, pas ce test d'action. – LukLed

+0

Cette réponse est correcte. Le problème ModelState est un bug. Que ce soit par design ou non, ça me dérange. =) –

Questions connexes