J'ai une méthode d'édition de base dans mon contrôleur qui redirige vers une liste de niveau supérieur ("Index") lorsque l'édition réussit. Comportement standard après l'échafaudage MVC.
J'essaie de modifier cette méthode d'édition pour qu'elle redirige vers la page précédente (et non vers l'index). Comme ma méthode d'édition n'utilise pas le paramètre d'entrée mappé par défaut "id", j'ai d'abord essayé de l'utiliser pour transmettre l'URL précédente.
Dans ma méthode Edit "get", j'ai utilisé cette ligne pour récupérer l'URL précédente et cela a bien fonctionné :
ViewBag.ReturnUrl = Request.UrlReferrer;
J'ai ensuite envoyé cette URL de retour à la méthode Edit "post" en utilisant ma balise de formulaire comme ceci :
@using (Html.BeginForm(new { id = ViewBag.ReturnUrl }))
C'est maintenant que les roues tombent. Je n'ai pas réussi à analyser l'URL du paramètre id correctement.
*** MISE À JOUR : RÉSOLU ** *
En utilisant l'exemple de Garry comme guide, j'ai changé mon paramètre de "id" à "returnUrl" et j'ai utilisé un champ caché pour passer mon paramètre (au lieu de la balise de formulaire). Leçon apprise : N'utilisez le paramètre "id" que de la manière dont il est censé être utilisé et restez simple. Cela fonctionne maintenant. Voici mon code mis à jour avec des notes :
Tout d'abord, je récupère l'URL précédente en utilisant Request.UrlReferrer comme je l'ai fait la première fois.
//
// GET: /Question/Edit/5
public ActionResult Edit(int id)
{
Question question = db.Questions.Find(id);
ViewBag.DomainId = new SelectList(db.Domains, "DomainId", "Name", question.DomainId);
ViewBag.Answers = db.Questions
.AsEnumerable()
.Select(d => new SelectListItem
{
Text = d.Text,
Value = d.QuestionId.ToString(),
Selected = question.QuestionId == d.QuestionId
});
// Grab the previous URL and add it to the Model using ViewData or ViewBag
ViewBag.returnUrl = Request.UrlReferrer;
ViewBag.ExamId = db.Domains.Find(question.DomainId).ExamId;
ViewBag.IndexByQuestion = string.Format("IndexByQuestion/{0}", question.QuestionId);
return View(question);
}
et je passe maintenant le paramètre returnUrl du modèle à la méthode [HttpPost] en utilisant un champ caché dans le formulaire :
@using (Html.BeginForm())
{
<input type="hidden" name="returnUrl" value="@ViewBag.returnUrl" />
...
Dans la méthode [HttpPost], nous extrayons le paramètre du champ caché et nous le redirigeons vers .....
//
// POST: /Question/Edit/5
[HttpPost]
public ActionResult Edit(Question question, string returnUrl) // Add parameter
{
int ExamId = db.Domains.Find(question.DomainId).ExamId;
if (ModelState.IsValid)
{
db.Entry(question).State = EntityState.Modified;
db.SaveChanges();
//return RedirectToAction("Index");
return Redirect(returnUrl);
}
ViewBag.DomainId = new SelectList(db.Domains, "DomainId", "Name", question.DomainId);
return View(question);
}
1 votes
Même si vous n'utilisez pas
id
Je ne l'utiliserais pas pour passer une URL. Cela ressemble à un hack, et je suis sûr qu'il y a une meilleure façon de le faire.0 votes
Oui, Eirc, vous avez raison. J'utilisais un affreux hack. C'est ma première application MVC. J'ai essayé beaucoup de choses et lu beaucoup de messages et le hack était ma meilleure tentative. Je l'ai corrigé en me basant sur l'exemple de Gary. Merci,