0

我有一个应用程序。

我被困在我想将模型从 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
}

我可以这样做吗?我找不到办法。

请帮助我。

谢谢

4

1 回答 1

1

我可以这样做吗?

不,你不能。您只能将简单的标量属性传递给RedirectToAction调用的路由值。传递复杂对象是没有意义的,因为当您执行重定向时,只有简单的属性会作为查询字符串参数包含在 GET 请求中。

所以你有不同的可能性:

  1. 将实体保留在后端,然后仅将 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);
        ...
    }
    
  2. 传递所有属性并让模型绑定器在 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 个字符的内容。

  3. 使用 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 用于此类事情。会话当然不能解决书签的问题(因为用户可能在中间关闭了他的浏览器,会话将丢失)。会话还引入了网络农场场景中的其他问题。例如,如果会话存储在内存中(这是默认设置),这意味着您可以将值存储在场的一个节点上,但是当您执行重定向时,您可能会命中场的另一个节点,然后这个节点没有对会话有任何了解。因此人们开始使用进程外会话——存储在状态服务机器或 SQL 服务中。但有什么意义呢?我的意思是看看我的第一个和推荐的解决方案。如果您想在网络农场环境中使用可扩展的解决方案,这正是您最终会遇到的事情。

于 2013-01-01T11:54:40.033 回答