C# ASP.NET MVC Вернуться на предыдущую страницу

У меня есть базовый метод Edit в моем контроллере, который перенаправляет обратно на листинг верхнего уровня («Index»), когда редактирование завершается успешно. Стандартное поведение после скаффолдинга MVC.

Я пытаюсь изменить этот метод редактирования, чтобы он перенаправлял обратно на предыдущую страницу (не на индекс). Поскольку мой метод редактирования не использовал сопоставленный входной параметр «id» по умолчанию, я сначала попытался использовать его для передачи предыдущего URL-адреса.

В моем методе Edit «get» я использовал эту строку, чтобы получить предыдущий URL-адрес, и он работал нормально:

ViewBag.ReturnUrl = Request.UrlReferrer;

Затем я отправил этот возвращаемый URL-адрес в метод Edit «post», используя свой тег формы, например:

@using (Html.BeginForm(new { id = ViewBag.ReturnUrl }))

Вот здесь и отвалились колеса. Мне не удалось правильно проанализировать URL-адрес из параметра id.

*** ОБНОВЛЕНИЕ: РЕШЕНО** *

Используя пример Гарри в качестве руководства, я изменил свой параметр с «id» на «returnUrl» и использовал скрытое поле для передачи мой параметр (вместо тега формы). Извлеченный урок: используйте параметр «id» только так, как он предназначен для использования, и делайте его простым. Теперь это работает. Вот мой обновленный код с примечаниями:

Во-первых, я беру предыдущий URL-адрес, используя Request.UrlReferrer, как и в первый раз.

    //
    // 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);
    }

и теперь я передаю параметр returnUrl из Модели в метод [HttpPost] с помощью скрытого поля в виде:

@using (Html.BeginForm())
{
    <input type="hidden" name="returnUrl" value="@ViewBag.returnUrl" />
    ...

В методе [HttpPost] мы вытаскиваем параметр из скрытого поля и перенаправляем на него.. ..

    //
    // 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);
    }
65
задан 25 revs, 2 users 98% 5 October 2014 в 13:15
поделиться