我有一个申请。
我遇到了一个问题,我希望将模型从Post方法传递给Get方法。
// Code in get method
FoundAccounts fa=new FoundAccounts();
fa.register = model;
return RedirectToAction("FoundAccounts", fa);
//Post Method
public ActionResult FoundAccounts(FoundAccounts fa)
{
//Use that values here
}
我可以这样做吗? 我无法找到办法。
请帮助我。
由于
答案 0 :(得分:1)
不,你不能。您只能将简单的标量属性传递给我可以这样做吗?
RedirectToAction
调用的路由值。传递复杂对象没有意义,因为当您执行重定向时,只有简单属性将作为查询字符串参数包含在GET请求中。
所以你有不同的可能性:
在您的后端保留实体,然后仅将ID传递给GET操作(这是我推荐的解决方案):
int id = repository.Save(fa);
return RedirectToAction("FoundAccounts", new { id = id });
然后您的GET操作会将id作为操作参数,并使用此id
从最初保存它的任何位置检索实体:
public ActionResult FoundAccounts(int id)
{
FoundAccounts model = repository.Get(id);
...
}
传递所有属性并让模型绑定器在GET操作中使实体脱水:
return RedirectToAction("FoundAccounts", new
{
prop1 = fa.prop1,
prop2 = fa.prop2,
...
});
显然,如果你有一些复杂的属性,你也需要传递它们。请记住,您包含的属性将是您可以在GET操作中检索的属性。其他一切都会丢失:
return RedirectToAction("FoundAccounts", new RouteValueDictionary
{
{ "prop1.SubComplexProp1", fa.prop1.SubComplexProp1 },
{ "prop1.SubComplexProp2", fa.prop1.SubComplexProp2 },
{ "prop2", fa.prop2 },
});
这种解决方案的缺点是,如果你有很多属性,这很快就会变得很麻烦。你甚至可以遇到障碍,因为GET请求的大小有限制。此限制因浏览器而异,但我不会在GET请求中传递超过2048个字符。
使用Session或TempData(不推荐使用它,因为它会在您的应用程序中引入状态);
TempData["fa"] = fa;
return RedirectToAction("FoundAccounts");
然后在GET操作中从Session或TempData中检索模型:
public ActionResult FoundAccounts()
{
FoundAccounts model = TempData["fa"] as FoundAccounts;
...
}
Session和TempData之间的区别在于TempData仅在单个重定向中存活,然后由框架自动逐出。它使用Session,它只是在读取GET操作中的值后自动清除。当然,问题在于如果用户点击 F5 来刷新浏览器中的页面,您将不再在TempData中找到该值,因为它被驱逐了。更糟糕的是,如果用户决定为GET操作添加书签,如果他稍后决定返回并导航到此书签,他将会遇到同样的问题。所以人们倾向于使用Sessions来做这些事情。会话当然不能解决书签问题(因为用户可能已经关闭了他的浏览器,会话将丢失)。 Sessions还会在Web场方案中引入其他问题。例如,如果会话存储在内存中(这是默认值),这意味着您可以将值存储在服务器场的一个节点上,但是当您执行重定向时,您可能会命中服务器场的另一个节点,然后此节点不会对会话有任何了解。因此人们开始使用进程外会话 - 存储在State Service机器或SQL服务中。但重点是什么?我的意思是看看我的第一个和推荐的解决方案。如果您希望在Web场环境中使用可扩展的解决方案,那么这将是您最终的结果。