В чем разница между возвратом View (модель) и возвратом RedirectToAction («ViewName», модель) - PullRequest
2 голосов
/ 01 июля 2011

Я не могу заставить свое действие Index () передать действительную модель моему отзыву () Action

... ActionResult Index () ...

            else
            {
                return RedirectToAction("Review", wizard); <--wizard is a valid object here....

            }

ActionResultОбзор ()

    public ActionResult Review()
    {
        return View(_wizard); <-- THis is always null.
    }

Обновление: Вот весь мой контроллер.Я хочу перенести пользователя из индекса мастера на страницу обзора, а затем, наконец, на страницу передачи, которая фактически сохраняет данные.У меня есть реальные проблемы, когда я оборачиваюсь вокруг последней части.Когда вы привыкли к классической игре, в которой вы должны явно писать все с нуля, довольно сложно привыкнуть к наследованию Magic в MVC3.Бьюсь об заклад, я пишу много ненужного кода.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using mvc3test.Models;
using Microsoft.Web.Mvc;
using System.Web.Mvc;
using mvc3test.Services;

namespace mvc3test.Controllers
{

    public class WizardController : Controller
    {

        private WizardViewModel wizard = new WizardViewModel();
        private DR405DBContext db;

        public WizardController(IDBContext dbContext)
        {
            db = (DR405DBContext)dbContext;
        }

        public WizardController()
        {
            db = new DR405DBContext();
        }

        public ActionResult Index()
        {

            wizard.Initialize();
            return View(wizard);
        }

        [HttpPost]
        public ActionResult Index([Deserialize] WizardViewModel wizard, IStepViewModel step)
        {

            wizard.Steps[wizard.CurrentStepIndex] = step;
            if (ModelState.IsValid)
            {
                if (!string.IsNullOrEmpty(Request["next"]))
                {
                    wizard.CurrentStepIndex++;
                }
                else if (!string.IsNullOrEmpty(Request["prev"]))
                {
                    wizard.CurrentStepIndex--;
                }
                else
                {
                    return View("Review", wizard);

                }
            }
            else if (!string.IsNullOrEmpty(Request["prev"]))
            {
                wizard.CurrentStepIndex--;
            }
            return View(wizard);


        }


        [AllowAnonymous]
        public ActionResult Review(WizardViewModel model)
        {
            return View(model);
        }

        [AllowAnonymous]
        [HttpGet]
        public ActionResult Review(Int32 ID)
        {
            var service = new DR405Service(db);
            var myWizard = service.WireUpDataModelToViewModel(service.DBContext.dr405s.Single(p => p.ID == ID));

            return View(myWizard);
        }


        public ActionResult Transmit()
        {
            var service = new DR405Service(db);
            service.Wizard = wizard;
            service.Save();
            return View();
        }


    }
}

Ответы [ 3 ]

2 голосов
/ 01 июля 2011

Per msdn RedirectToAction вызовет еще один запрос get для действия Review.

Возвращает ответ HTTP 302 на браузер, который заставляет браузер сделать запрос GET к указанному действие.

Это приводит к тому, что объект wizard теряет свое значение и нуждается в повторном заполнении.

View() просто возвращает представление, связанное с этим действием, в текущем контексте.

Вы можете либо поместить мастера в TempData, return View("Review", wizard), либо, если это возможно, передать wizard в качестве значений маршрута.

1 голос
/ 01 июля 2011

RedirectToAction возвращает HTTP 302-ответ браузеру, в результате чего браузер отправляет GET-запрос на указанное действие. Таким образом, вы не можете передать сложный объект, как вы делаете

Это не лучшее решение, но попробуйте поместить объект мастера перед перенаправлением в ViewData:

ViewData["wizard"] = wizard

, а затем получить его в обзоре ()

var wizard = (Wizard)ViewData["wizard"];
0 голосов
/ 01 июля 2011

return RedirectToAction («Обзор», мастер);передал объект мастера в представление с именем Review.Обзор должен быть строго типизированным представлением, основанным на том же классе, что и мастер.

Публикация кода представления будет полезна, если это не отвечает на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...