是否有可能重定向到另一个传递它的动作以及我们当前的模型作为HttpPost?

时间:2011-07-01 04:45:55

标签: c# .net asp.net asp.net-mvc asp.net-mvc-3

所以,我正在试验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 个答案:

答案 0 :(得分:6)

最好的方法是将troll持久保存在服务器上(数据库?),然后在重定向时只将id传递给索引操作,以便可以将其取回。另一种可能性是使用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请求中保持不变。

另一种可能性包括在重定向时将troll对象的所有属性作为查询字符串参数传递:

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

答案 1 :(得分:0)

在CreateNew中必须有某种持久性,例如巨魔可能会保存在数据库中。它还必须有某种ID。所以Index方法可以改为

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