Ich habe eine grundlegende Bearbeitungsmethode in meinem Controller, die nach erfolgreicher Bearbeitung zu einer Liste der obersten Ebene („Index“) zurückleitet. Standardverhalten nach MVC-Gerüsten.
Ich versuche, diese Bearbeitungsmethode zu ändern, um zur vorherigen Seite (nicht zum Index) zurückzukehren. Da meine Edit-Methode nicht den standardmäßig zugeordneten Eingabeparameter "id" verwendete, habe ich zuerst versucht, damit die vorherige URL zu übergeben.
Bei meiner Edit-Methode "get" habe ich diese Zeile verwendet, um die vorherige URL abzurufen, und es hat einwandfrei funktioniert:
ViewBag.ReturnUrl = Request.UrlReferrer;
Ich habe diese Rückgabe-URL dann mithilfe meines Formular-Tags wie folgt an die Methode "Post" bearbeiten gesendet:
@using (Html.BeginForm(new { id = ViewBag.ReturnUrl }))
Hier fielen die Räder ab. Ich konnte die URL vom ID-Parameter nicht richtig analysieren.
***. UPDATE: Gelöst ** *
Am Beispiel von Garry habe ich meinen Parameter von "id" in "returnUrl" geändert und ein verstecktes Feld verwendet, um meinen Parameter zu übergeben (anstelle des Formular-Tags). Lektion gelernt: Verwenden Sie den Parameter "id" nur so, wie er verwendet werden sollte, und halten Sie ihn einfach. Es funktioniert jetzt. Hier ist mein aktualisierter Code mit Notizen:
Zuerst greife ich mit Request.UrlReferrer wie beim ersten Mal auf die vorherige URL zurück.
//
// 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);
}
und ich übergebe jetzt den Parameter returnUrl vom Modell an die Methode [HttpPost] unter Verwendung eines ausgeblendeten Feldes in der Form:
@using (Html.BeginForm())
{
<input type="hidden" name="returnUrl" value="@ViewBag.returnUrl" />
...
In der [HttpPost] -Methode ziehen wir den Parameter aus dem ausgeblendeten Feld und leiten ihn dorthin weiter ....
//
// 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);
}
id, würde ich es nicht verwenden, um eine URL zu übergeben. Das scheint ein Hack zu sein, und ich bin sicher, es gibt einen besseren Weg, dies zu tun.