2009-06-14 8 views
1

J'ai deux formulaires sur une page: un formulaire de résultats et un formulaire de recherche. Le formulaire de recherche utilise une vue partielle car il est affiché sur plusieurs pages différentes. Je veux être en mesure de persister les données dans le formulaire de recherche selon le bouton sur lequel forme l'utilisateur clique. Le problème est que lorsque l'utilisateur clique sur un lien ou un bouton du formulaire de résultats, seules les valeurs de formulaire du formulaire de résultats sont affichées, les valeurs du formulaire de recherche ne sont pas incluses. Comment puis-je conserver les valeurs dans le formulaire de recherche même si ce n'est pas le formulaire qui est soumis? Je ne veux utiliser aucun type d'état de session pour maintenir le formulaire et je ne veux pas écrire les valeurs de recherche dans les champs cachés dans le formulaire de résultats. Je veux juste être en mesure de les poster avec les valeurs de formulaire du formulaire de résultats afin que les critères de recherche des utilisateurs peuvent être conservés à travers toute page qui affiche la vue partielle de recherche. Qu'est-ce que je rate?Données persistantes à partir de plusieurs formulaires dans ASP.NET MVC

La première pensée qui m'est apparue est de supprimer le formulaire qui entoure le contrôle de recherche et de le laisser simplement apparaître dans le formulaire avec les données de résultats. Je m'inquiète ici de nommer les conflits. Que se passe-t-il lorsque la recherche de a un contrôle avec le même nom que le formulaire de résultats, cela ne causerait-il pas un conflit de nommage? Je suppose que cela pourrait simplement être géré manuellement pour s'assurer qu'il y a des noms uniques chaque fois que vous affichez des vues partielles dans d'autres vues, allant même jusqu'à préfixer des valeurs avec le nom partiel, mais cela me rappelle la laideur de INamingContainer dans formulaires Web - plus fait pour les noms de champs encombrants dans votre modèle.

Existe-t-il une sorte de solution élégante qui permettra à un formulaire de persister dans l'état qui me manque? Merci!

+0

Eh bien, vous auriez besoin d'un

tag qui couvre à la fois votre formulaire de résultat et le formulaire de recherche si vous souhaitez le soumettre en un seul coup. Vous finiriez avec des formulaires Web ASP.NET si vous faites cela;) Il gère même les conflits de nommage bien ... – chris166

+0

Hahaha ... j'ai eu le même problème. Doit favori ceci. –

Répondre

1

Normalement, je persiste les critères de recherche côté serveur lorsque la recherche est effectuée. Si l'utilisateur modifie les critères de recherche après avoir effectué la recherche, puis affiche le formulaire, toutes les modifications sont, bien sûr, perdues, mais c'est un comportement sans doute correct puisque la recherche n'a pas été invoquée. Cela est vrai que la recherche soit effectuée à partir d'un message complet ou via ajax. La manipulation de cette façon permet de garder les actions plus propres, je pense que vous n'avez pas besoin de gérer les données de recherche dans les autres actions. Si vous avez absolument besoin que les paramètres de recherche soient inclus, vous pouvez envisager d'afficher le second formulaire via javascript, récupérer dynamiquement les valeurs du champ de recherche et les ajouter au second formulaire (en tant que champs masqués) avant d'afficher le second forme. Vous n'auriez pas à maintenir les valeurs à deux endroits en synchronisation, mais vous devrez les copier dans le second formulaire avant de les poster.

+0

Merci pour l'entrée, j'ai déjà pensé à l'option javascript, mais j'essaie de ne pas me fier aux scripts côté client. Je pense que je me penche vers votre première option, bien que je répugne à compter sur l'état de session côté serveur, j'ai même pensé à utiliser la chaîne de requête, mais c'est beaucoup de faire le tour de page en page. J'avais aussi pensé à coder en base64 les valeurs de formulaire du contrôle de recherche et à les bourrer dans une variable cachée sur l'autre forme, peut-être l'appeler ViewState ... oh, attendez, ça a déjà été fait ... mais sérieusement serait-ce trop mal? – cnaegle

+2

Homme, n'ayez pas peur du côté client. Il facilite beaucoup le développement s'il est utilisé correctement + rend l'expérience de l'utilisateur beaucoup mieux. –

+0

Après avoir réfléchi et examiné les solutions possibles, nous avons décidé de maintenir le côté serveur de critères de recherche. Merci. – cnaegle

0

Je pense que la meilleure approche sera de stocker le texte de l'entrée de recherche lorsqu'il change dans la partie requête de votre deuxième URL d'action de formulaire. Par exemple (non testé):

$('input#yourSearchInput').change(function() 
{ 
    var searchText = $(this).val(); 

    // or? var searchText = encodeURIComponent($(this).val()); 

    var secondForm = $('form#secondFormId'); 

    var action = secondForm.attr('action'); 

    var queryStart = action.lastIndexOf('?search='); 
    if(queryStart > -1) { 
     action = action.substring(1, queryStart); 
    } 

    action = action + "?search=" + searchText; 

    secondForm.attr('action', action); 
}); 

Dans Controller (ou filtre personnalisé):

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    var search = Request.QueryString["search"]; 
    if(!String.IsNullOrEmpty(search)) { 
     ViewData["SearchFromPOST"] = search; 
    } 
    base.OnActionExecuting(filterContext); 
} 

Dans votre commande de recherche:

<%= TextBox("yourSearchInputId", ViewData["SearchFromPOST"]) %> 
+0

Merci pour la contribution et l'idée. Cependant, nous traitons avec des clients bancaires qui peuvent ou non autoriser des scripts côté client, ce qui ne serait pas une bonne option pour nous. – cnaegle

0

Lorsque vous avez quelques formulaires à votre page chaque formulaire envoie uniquement ses propres données. Dans WebForms, vous n'aviez qu'un seul formulaire (au moins côté serveur) et chaque contrôle était inclus dans ce formulaire. Dans ASP.NET MVC, vous pouvez utiliser le même scénario et je crains que vous deviez le faire si vous voulez avoir le comportement décrit. N'oubliez pas que les formulaires partiels ne doivent pas nécessairement être des formulaires réels. De plus, RenderPartial est principalement utilisé pour la création de mise en page «control-like». En ce qui concerne la deuxième partie de votre question, je suggère de nommer vos zones de texte dans le formulaire de recherche avec un préfixe normal comme "search" ou quelque chose comme ça. Par exemple, si vous avez une zone de texte "texte" et "langue" dans le formulaire, vous aurez "searchText" et "searchLanguage".Ces noms sont assez uniques et vous aurez des noms normaux dans vos paramètres. Je ne suggère pas que vous remplissiez les valeurs cachées dans votre formulaire de résultats sur l'événement POST puisque vous avez dit que ce n'est pas une option pour vous, mais c'est peut-être le seul moyen si vous voulez avoir deux formulaires.

+0

J'utilise la vue partielle pour la garder au DRY parce que le formulaire de recherche est sur presque toutes les pages de l'application. Comme indiqué ci-dessus, je veux rester loin de préfixer chaque champ parce qu'il semble juste lourd et faux et les noms de modèles de recherche ne correspondent pas au schéma de base de données sous-jacent. Est-ce que c'est trop difficile de ma part? Peut-être. En ce moment, je suis en train d'explorer mes options avant de m'engager dans une architecture et de m'inscrire dans un coin. Merci pour l'entrée – cnaegle

1

Au moment où je l'ai eu comme ceci:

formes qui ont la boîte de recherche, messages requête (et des données supplémentaires si nécessaire) pour rechercher le contrôleur qui rend ensuite vue de recherche. La vue de recherche est faite à partir de la boîte de recherche et des résultats partiels des résultats de la recherche. Pendant ce - le formulaire de boîte de recherche est reconstruit par les données publiées.

Si j'ai besoin d'un formulaire de recherche pour effectuer une autre requête de recherche (par exemple, avec un index de page spécifié), il passe par ajax, qui affiche le formulaire de recherche + index de page. Jetez un oeil here des idées (mise à jour de la méthode JS avec le paramètre targetId pour la mise à jour spécifié div/formulaire et les données post supplémentaires si nécessaire ici comme ceci:

form.serialize()+"&pageIndex=5" 

En bref: si vous avez besoin de maintenir l'état de la forme + mise à jour Une autre en une page - pensez à utiliser des mises à jour partielles, sinon vous finirez par inventer ViewState 2.0

Une mise en garde de cette façon - il est difficile de faire en sorte que la boîte de recherche contienne quelque chose qui est en rapport avec les résultats de recherche (ie - nombre total de résultats trouvés Avant de pouvoir gérer cela, notre concepteur a fait cela - j'ai juste besoin d'ajouter div avec le nom de classe approprié ("sbsubst" ou quelque chose) et il semble que c'est dans la recherche boîte. :)

+0

"sinon vous finirez par inventer ViewState 2.0" - tout à fait d'accord :) –

+0

D'autre part - ce n'est pas bon du tout ... Les demandes de recherche doivent être RESTful - ils doivent utiliser la méthode GET. Cela conduit à la création d'URL dans la page de résultats de recherche en utilisant $ ("# searchbox"). Serialize() + "& page = 3" et en reconstruisant la boîte de recherche par les valeurs soumises (via la requête). –

Questions connexes