Можно ли перенаправить на другое действие, передавая также нашу текущую модель как HttpPost? - PullRequest
0 голосов
/ 01 июля 2011

Итак, я экспериментирую с ASP.NET MVC, и у меня есть следующий код:

public class TrollController : Controller
{
    public ActionResult Index()
    {
        var trollModel = new TrollModel()
                                    {
                                        Name = "Default Troll", 
                                        Age = "666"
                                    };
        return View(trollModel);
    }

    [HttpPost]
    public ActionResult Index(TrollModel trollModel)
    {
        return View(trollModel);
    }

    public ActionResult CreateNew()
    {
        return View();
    }

    [HttpPost]
    public ActionResult CreateNew(TrollModel trollModel)
    {
        return RedirectToAction("Index");
    }
}

Идея состоит в том, чтобы иметь индексную страницу, которая показывает возраст нашего тролля, а также его имя.

Есть действие, которое позволяет нам создать тролля, и после его создания мы должны вернуться на страницу индекса, но на этот раз с нашими данными, а не с данными по умолчанию.

Есть лиспособ передать TrollModel CreateNew(TrollModel trollModel) получает Index(TrollModel trollModel)?Если да, то как?

Ответы [ 2 ]

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

Лучший подход - сохранить тролль где-нибудь на сервере (в базе данных?), А затем при перенаправлении передать только идентификатор в действие индекса, чтобы он мог получить его обратно. Другая возможность - использовать TempData или Session:

[HttpPost]
public ActionResult CreateNew(TrollModel trollModel)
{
    TempData["troll"] = trollModel;
    return RedirectToAction("Index");
}

public ActionResult Index()
{
    var trollModel = TempData["troll"] as TrollModel;
    if (trollModel == null)
    {
        trollModel = new TrollModel
        {
            Name = "Default Troll", 
            Age = "666"
        };
    }
    return View(trollModel);
}

TempData выдержит только одно перенаправление и будет автоматически удален при последующем запросе, тогда как Session будет постоянным во всех HTTP-запросах для сеанса.

Еще одна возможность состоит в передаче всех свойств объекта тролля в качестве аргументов строки запроса при перенаправлении:

[HttpPost]
public ActionResult CreateNew(TrollModel trollModel)
{
    return RedirectToAction("Index", new  
    {  
        Age = trollModel.Age, 
        Name = trollModel.Name 
    });
}

public ActionResult Index(TrollModel trollModel)
{
    if (trollModel == null)
    {
        trollModel = new TrollModel
        {
            Name = "Default Troll", 
            Age = "666"
        };
    }
    return View(trollModel);
}

Теперь вам может потребоваться переименовать действие Index POST, поскольку у вас не может быть двух методов с одинаковыми именами и аргументами:

[HttpPost]
[ActionName("Index")]
public ActionResult HandleATroll(TrollModel trollModel)
{
    return View(trollModel);
}
0 голосов
/ 01 июля 2011

В CreateNew должно быть какое-то постоянство, например тролль может быть сохранен в базе данных. Он также должен иметь какой-то идентификатор. Таким образом, метод индекса может быть изменен на

public ActionResult Index(string id)
{
    TrollModel trollModel;

    if (string.IsNullOrEmpty(id))
    {
        trollModel = new TrollModel()
                                {
                                    Name = "Default Troll", 
                                    Age = "666"
                                };
    }
    else
    {
        trollModel = GetFromPersisted(id);
    }

    return View(trollModel);
}

и в CreateNew

[HttpPost]
public ActionResult CreateNew(TrollModel trollModel)
{
    return RedirectToAction("Index", new {id = "theNewId"});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...