2008-08-25 6 views
2

Ma page asp.net affichera différents contrôles basés sur le rapport sélectionné par un utilisateur, par exemple. certains rapports nécessitent 5 listes déroulantes, deux cases à cocher et 6 listes déroulantes).Postback avec chaîne de requête modifiée à partir d'une liste déroulante dans ASP.NET

Ils peuvent sélectionner un rapport en utilisant deux méthodes. Avec SelectedReport=MyReport dans la chaîne de requête, ou en le sélectionnant dans une liste déroulante. Et c'est un cas fréquent pour eux de venir à la page avec SelectedReport dans la chaîne de requête, puis de modifier le rapport sélectionné dans la liste déroulante.

Ma question est, est-il de toute façon de faire de la liste déroulante modifier la chaîne de requête quand il est sélectionné. Donc, je voudrais SelectedReport=MyNewReport dans la chaîne de requête et la page à poster.

Pour l'instant, il s'agit simplement d'une publication normale, ce qui laisse le SelectedReport=MyReport dans la chaîne de requête, même s'il ne s'agit pas du rapport actuellement sélectionné.

Editer: Et j'ai aussi besoin de préserver ViewState.

J'ai essayé de faire Server.Transfer(Request.Path + "?SelectedReport=" + SelectedReport, true) dans le gestionnaire d'événements pour la liste déroulante, et cela fonctionne fonction sage, malheureusement, car c'est un Server.Transfer (pour préserver ViewState) au lieu d'un Response.Redirect l'URL est en retard derrière ce qui est montré. Peut-être que je suis en train de demander l'impossible ou d'aller complètement dans le mauvais sens.

@Craig La collection QueryString est en lecture seule et ne peut pas être modifiée.
@Jason Ce serait génial, sauf que je perdrais le ViewState non? (Désolé j'ai ajouté cela après avoir vu votre réponse).

Répondre

0

S'il s'agit d'une publication automatique lorsque les données changent, vous devriez pouvoir rediriger vers la nouvelle chaîne de requête avec un gestionnaire côté serveur de l'événement 'onchange' de la liste déroulante. Si c'est un bouton, gérer le côté serveur dans l'événement click. Je posterais un échantillon de ce dont je parle mais je suis sur le point de sortir pour aller chercher les enfants.

1

Avez-vous essayé de modifier Request.QueryString [] sur SelectedIndexChanged pour DropDown? Cela devrait faire l'affaire.

0

Vous pouvez remplir votre liste déroulante en fonction de la chaîne de requête sur les non-publications, puis utilisez toujours la valeur dans la liste déroulante. De cette façon, la première visite de l'utilisateur sur la page sera basée sur la chaîne de requête et les modifications suivantes apportées à la liste déroulante modifieront le rapport sélectionné.

3

Vous devez désactiver l'autopostback dans la liste déroulante. Vous devez ensuite ajouter du code javascript qui prendra en charge ce rôle. Dans le code du gestionnaire d'événements pour l'événement onchange de la liste déroulante, vous devez créer une URL sur la valeur actuellement sélectionnée dans la liste déroulante et utiliser javascript pour ensuite demander cette page.

EDIT: Voici un code rapide et sale qui indique ce qui ferait l'affaire:

<script> 
    function changeReport(dropDownList) { 
     var selectedReport = dropDownList.options[dropDownList.selectedIndex]; 
     window.location = ("scratch.htm?SelectedReport=" + selectedReport.value); 
    } 
</script> 

<select id="SelectedReport" onchange="changeReport(this)"> 
    <option value="foo">foo</option> 
    <option value="bar">bar</option> 
    <option value="baz">baz</option> 
</select> 

vous De toute évidence besoin de faire un peu plus, mais cela fonctionne et vous donnera ce qu'il semble que vous êtes après. Je recommanderais d'utiliser une boîte à outils JavaScript (j'utilise MochiKit, mais ce n'est pas pour tout le monde) pour obtenir un peu plus de travail - utilisez des techniques JavaScript discrètes si possible (contrairement à ce que j'utilise dans cet exemple).

@Ray: Vous utilisez ViewState ?! Je suis vraiment désolé. : P Pourquoi, dans ce cas, avez-vous besoin de le préserver. priez dites?

0

L'état d'affichage ne dure que multiple requests for the same page. Changer la chaîne de requête dans l'URL demande une nouvelle page, effaçant ainsi l'état d'affichage.

Est-il possible de supprimer la dépendance à l'état d'affichage en ajoutant plus de paramètres de chaîne de requête? Vous pouvez ensuite créer une nouvelle URL et Response.Redirect.

Une autre option consiste à utiliser le Action property sur le formulaire pour effacer la chaîne de requête de sorte qu'au moins la chaîne de requête ne contredit pas ce qui est affiché sur la page après que l'utilisateur sélectionne un rapport différent.

Form.Action = Request.Path; 
0

Vous pouvez utiliser la fonction suivante pour modifier la chaîne de requête en asp.net postback sur l'utilisation du script webresource.axd comme ci-dessous.

var url = updateQueryStringParameter(window.location.href, 
            'Search', 
            document.getElementById('txtSearch').value); 
WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("searchbutton", "", 
            true, "aa", url, false, true)); 
Questions connexes