2009-04-16 6 views
0

J'ai une page de recherche simple sur mon avis d'index avec un menu déroulant et une zone de texte. Je voudrais me souvenir de la préférence de l'utilisateur pour la liste déroulante, donc je stocke cela dans une table et le récupère au besoin. Voici la fonction de contrôleur:comportement Puzzling d'application ASP.NET MVC

Function Index(ByVal lob As String, ByVal filter As String) As ActionResult 
    If If(lob, "") = "" Then 
     lob = GetUserPreferenceLob() 
    End If 
    ViewData("lob") = New SelectList(GetLobValues(), "Value", "Text", lob) 
    ViewData("message") = lob 
    Return View() 
End Function 

La vue ressemble à ceci:

<% Using Html.BeginForm()%> 
Line of Business: 
<%=Html.DropDownList("lob", Nothing, New With {.onchange = "document.forms[0].submit()"})%> 
Search: 
<%=Html.TextBox("filter")%> 
<img src="..." alt="Search" onclick="document.forms[0].submit()" /> 
<%=ViewData("message")%> 
<% End Using%> 

Quand je commence l'application (ce qui est la page par défaut), il charge avec succès la liste et sélectionne l'élément de l'utilisateur. Si je navigue sur la page cependant, comme via un lien ailleurs sur la page, il charge la liste mais sélectionne le premier élément par défaut. J'ai exécuté le débogueur et il passe toujours par la fonction Index, et selon la sortie "message" il passe toujours la bonne valeur à sélectionner, alors pourquoi ce scénario ne sélectionne pas la bonne entrée dans la liste?

Mise à jour: J'ai d'autres données sur le formulaire qui dépend de la valeur sélectionnée dans la liste déroulante. Lorsque vous naviguez vers la page via un lien, le reste de la page se comporte comme si l'élément approprié était sélectionné, mais la liste déroulante par défaut est en haut. En d'autres termes, si ma liste déroulante a les valeurs "A", "B" et "C", et je sélectionne "C", puis cliquez sur un lien qui recharge la page, la liste déroulante affiche "A", mais le reste de la page contient les données pour "C".

+0

Avez-vous vérifié pour vous assurer que plusieurs éléments ne sont pas définis comme sélectionnés? (à la fois dans votre ViewData ["lob"] et dans la source html réelle) –

+0

Peut-être que je manque quelque chose, mais comment les données sont-elles liées dans vos fragments de code? Le "Nothing" dans "... DropDownList (" lob ", Nothing ...", ne devrait-il pas être DropDownList ("lob", lob ... "où lob est une propriété publique ou protégée dans le code-behind –

+0

@James Avery - Quand il fonctionne correctement, l'élément approprié a sélectionné = "sélectionné" dans le balisage Lorsque je navigue via le lien, aucun des éléments n'est sélectionné dans le balisage, c'est pourquoi il est par défaut en haut de la liste . – gfrizzle

Répondre

2

Avez-vous essayez de rafraîchir la page après avoir suivi un lien vers la page. Ce pourrait être une version localement mise en cache.

+0

Il ne semble pas avoir quelque chose à voir avec la mise en cache. La page n'est jamais rendue avec le premier élément de la liste sélectionnée - pourquoi y aurait-il une version en cache? J'ai également essayé d'ajouter tout le code d'expiration du cache d'un autre thread SO, et cela n'a rien changé. – gfrizzle

+0

Juste en vérifiant les possibilités les plus évidentes. –

0

cache probablement ...

Vérifiez ce fil lié here (Stack Overflow)

+0

J'ai essayé d'implémenter le code d'expiration du cache, mais cela n'a rien changé. Il ne semble pas être lié au cache. – gfrizzle

0

J'ai une question très similaire avec TextBoxes:

Sur ma page, je rendre une zone de texte avec Html.TextBox ("Attribut", Model.Attribute). L'utilisateur entre une valeur dans cette zone de texte, puis appuie sur un bouton. Dans le code qui est exécuté, je calcule une nouvelle valeur pour l'attribut du modèle, puis restaure la vue. Le Html.TextBox ("Attribute", Model.Attribute) affiche toujours la valeur entrée par l'utilisateur, tandis que Html.Encode (Model.Attribute) affiche la valeur correcte du modèle.

Il semble que Html.TextBox préfère afficher la valeur saisie par l'utilisateur plutôt que la valeur modifiée par le programmeur du modèle. Ainsi, au lieu d'afficher la valeur de son deuxième paramètre d'entrée, Html.TextBox semble afficher ViewData.ModelState ["Atrribute"]. Value.RawValue.

Je viens de changer l'état d'affichage et le modèle dans l'aller-retour.