将自定义数据附加到重定向到路由并在剃刀视图中检索

时间:2015-02-26 13:41:13

标签: asp.net-mvc

当我的ModelState有效时,我这样做是为了滚动到某个区域:

var url = Url.RouteUrl(new { controller = "Controller", action = "Index" });
                return Redirect(url + "#anchor" + viewModel.Id);

现在我想将数据附加到此响应并检查我的剃刀视图:

  @if(@Request.Url.property == MyData)
            {

            }

我该怎么做?

我担心当我将一些自定义字符串附加到网址时,我的“去锚”功能会破坏...

我可以使用标题吗?

2 个答案:

答案 0 :(得分:1)

您可以使用ControllerBase.TempData属性在重定向中传递数据。这是一个键值对可索引对象,它在单个HTTP请求中保留数据。 E.g。

TempData["name"] = "John Doe";
TempData["address"] = new Address { Line1 = "123 Street", Line2 = "Town" };

请参阅以下指南:http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications

答案 1 :(得分:0)

您将了解HTTP作为协议的工作原理。 ASP.NET倾向于让你认为所有类型的东西都是可能的,因为它只是类和方法,你可以直接用C#做你想做的任何事情。但是,它从根本上受到运行的平台的限制,在本例中是网络。

重定向是一种服务器响应,它只包含客户端应检索的URL,而不是最初请求的URL。一旦Web浏览器收到此类响应,它就会向该URL发出另一个GET请求。这里重要的部分是重定向总是导致GET请求。

使用GET请求,您只有一种传递任何类型数据的方法:URL本身。通常,这通过查询字符串(您在某些网址末尾看到的?foo=bar爵士乐)发生。因此,一个基本限制是您只能将标量数据作为键值对的一部分传递。换句话说,传递名为foo的值为"bar"的数据非常好,但是传递整个C#对象的值是不可能的。如果您需要整个对象,则必须将其展平,以使该对象上的每个属性都是查询字符串中的单独名称 - 值对。

所以,回到你的代码,如果你想传递一些额外的数据,你会做如下的事情:

var url = Url.Action("Index", "Controller", new { foo = "bar" })

这会产生类似于以下的URL:/ Controller / Index?foo = bar

如果你需要添加一个片段(URL的#foo部分),那么它将被添加到URL的末尾,在查询字符串之后,而不是之前。