Comment faire pour rediriger une requête POST à l'url maintien des valeurs de modèle MVC
J'ai un assez standard de tri/filtre/page formulaire de recherche, mais ont besoin de contrôler le format de l'url. Le tri/filtre/page paramètres devraient tous faire partie de l'url de sorte que, par exemple, l'adresse peut être envoyé par courriel à quelqu'un.
Quand un autre paramètre de filtre est ajouté, une requête POST est fait. Mon contrôleur méthode ressemble à ceci:
[HttpPost]
public ActionResult Search(string filterField,
Operator filterOperator,
string filterValue,
PeopleGroupSearchModel model);
La PeopleGroupSearchModel
est renseignée à partir des paramètres de chaîne de requête. Le filter*
paramètres sont à venir à partir de la publication des valeurs d'un formulaire.
Je voudrais analyser la condition des valeurs de filtre, qui seront ensuite ajouter un filtre pour une collection dans le modèle appelé Filters
. Ensuite, prendre la mise à jour du modèle et de le convertir à l'url appropriée et que la réponse à l'utilisateur.
Ainsi, par exemple, s'ils sont sur cette page:
PeopleGroup/Search?page=4&sort=Country
... et après:
- filterField = PeopleGroupName
- filterOperator = Égal à
- filterValue = Zoulou
... une fois que tout le traitement est fait, l'adresse dans leur navigateur doit être quelque chose comme:
PeopleGroup/Search?page=4&sort=Country&PeopleGroupName=Zulu&PeopleGroupName_op=Equals
Donc plus ou moins ce que je suis en train de faire:
[HttpGet]
public ActionResult Search(PeopleGroupSearchModel model)
{
PeopleGroupData.Search(model);
ViewData.Model = model;
return View();
}
[HttpPost]
public ActionResult Search(string filterField,
Operator filterOperator,
string filterValue,
PeopleGroupSearchModel model)
{
PeopleGroupFilter filter = ParseFilter(filterField,
filterOperator,
filterValue);
model.Filters.Add(filter);
return RedirectToAction("Search", ???);
}
Je suis très nouveau pour MVC, donc si je vais sur ce tout à fait dans le mauvais sens, s'il vous plaît laissez-moi savoir!
OriginalL'auteur Dave Mateer | 2011-07-25
Vous devez vous connecter pour publier un commentaire.
Il ya un couple de possibilités pour mettre en œuvre les Redirection Après-Post modèle (qui est ce que vous êtes après ici et qui est un très bon modèle à mon humble avis) ASP.NET MVC:
Utilisation
TempData
. Dans le POST d'action stocker le modèle à l'intérieur deTempData
et rediriger:et puis à l'intérieur de l'action de Recherche pour vérifier TempData existence d'extraire le modèle:
L'inconvénient de cette approche est que
TempData
est conservée uniquement pour une seule redirection de sens que si l'utilisateur appuie sur la touche F5 alors que sur la Recherche OBTENEZ de l'action, vous êtes foutus. Ce pourrait être atténué par l'utilisation de Session à la place. Mais bien sûr Session présente un autre des problèmes d'évolutivité. Donc, je ne suis pas fan de cette approche.Passer toutes les propriétés de la demande:
Maintenant, quand redirigé vers la Recherche d'OBTENIR une action le modèle de classeur par Défaut sera capable de reconstruire le modèle. Un inconvénient évident de cette approche est que si votre modèle possède de nombreuses propriétés, et même pire propriétés de types complexes, cela pourrait vite devenir encombrant solution. Vous pourriez probablement sérialiser le modèle à l'aide du texte format JSON comme un paramètre de chaîne de requête. Bien sûr paramètres de chaîne de requête sont limitées entre les différents navigateurs de sorte que ce pourrait aussi être un non-non.
Persister le modèle d'une partie des données de stockage et de récupération de l'id unique de sorte qu'il peut être récupéré plus tard à partir de ce stockage:
Puis dans la action de récupérer le modèle à partir de cette même persistance de stockage à l'aide de l'id. J'aime cette approche et de l'utiliser la plupart du temps. Si la persistance de ces de la banque de données est cher, vous pouvez utiliser la mise en cache.
OriginalL'auteur Darin Dimitrov
Vous pouvez mettre les valeurs que vous avez besoin de garder en ControllerContext.RouteData.Les valeurs
Si vous avez besoin de quelque chose de plus générique vous pourriez faire une boucle par la postet les éléments de formulaire.
MODIFIER
Il ressemblerait à quelque chose comme le top rated de réponse ici: Comment avez-vous persister querystring valeurs dans asp.net mvc?
Vous avez raison, existant querystring paramètres ne sont pas dans ControllerContext.RouteData.Des valeurs. Vous devez les ajouter, qui je pense n'est pas ce que vous voulez.
OriginalL'auteur Mathias F
C'est probablement une violation de la MVC principes, mais une fois que j'ai arrêté de lutte contre le cadre et juste pensé à ce que j'essayais de faire en HTTP-terre, cette solution simple qui fonctionne pour moi:
OriginalL'auteur Dave Mateer