所以,我正在试验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)
?如果是,怎么样?
答案 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"});
}