Mam podstawową metodę edycji w moim kontrolerze, która przekierowuje z powrotem do listy najwyższego poziomu ("Indeks"), gdy edycja się powiedzie. Standardowe zachowanie po rusztowaniu MVC.C# ASP.NET MVC Powróć do poprzedniej strony
Próbuję zmienić tę metodę edycji, aby przekierować z powrotem na poprzednią stronę (nie indeks). Ponieważ moja metoda edycji nie korzystała z domyślnego zmapowanego parametru wejściowego "id", najpierw spróbowałem użyć tego do przekazania poprzedniego adresu URL.
W moim Edycja metody „get”, użyłem tej linii chwycić poprzedni adres URL i to działało w porządku:
ViewBag.ReturnUrl = Request.UrlReferrer;
Potem wysłał zwrotny adres URL do edycji „post” metody za pomocą mojego formularza w ten sposób:
@using (Html.BeginForm(new { id = ViewBag.ReturnUrl }))
To tutaj odpadły koła. Nie można poprawnie pobrać adresu URL z parametru id.
*** UPDATE: SOLVED ** *
Korzystanie przykład Garry jako przewodnika, zmieniłem parametr z "id" do "i" returnUrl stosowany ukryty pole do przekazania mojego parametru (zamiast tagu formularza). Lekcja: należy używać tylko parametru "id", w jaki sposób ma być używany i zachować proste. Teraz działa. Oto mój zaktualizowany kod z uwagami:
Po pierwsze, pobieram poprzedni adres URL za pomocą Request.UrlReferrer, tak jak zrobiłem to po raz pierwszy.
//
// 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);
}
i teraz przekazać parametr ReturnURL z modelu do metody [HttpPost] za pomocą ukrytego pola formularza:
@using (Html.BeginForm())
{
<input type="hidden" name="returnUrl" value="@ViewBag.returnUrl" />
...
W metodzie [HttpPost] możemy wyciągnąć parametr z ukryte pole i przekierowanie do niego ....
//
// 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);
}
Nawet jeśli nie używasz 'id', nie użyłbym go do przekazania adresu URL. To wygląda na włamanie i jestem pewien, że jest lepszy sposób na zrobienie tego. –
Tak, Eirc masz rację. Używałem brzydkiego hacka. To moja pierwsza aplikacja MVC. Próbowałem wielu rzeczy i czytałem wiele postów, a hack był moją najlepszą próbą. Naprawiłem to na przykładzie Gary'ego. Dzięki, –