当我的ModelState有效时,我这样做是为了滚动到某个区域:
var url = Url.RouteUrl(new { controller = "Controller", action = "Index" });
return Redirect(url + "#anchor" + viewModel.Id);
现在我想将数据附加到此响应并检查我的剃刀视图:
@if(@Request.Url.property == MyData)
{
}
我该怎么做?
我担心当我将一些自定义字符串附加到网址时,我的“去锚”功能会破坏...
我可以使用标题吗?
答案 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的末尾,在查询字符串之后,而不是之前。