我有一种方法,可以将用户重定向回位于web应用程序根目录下的登录页面.

我使用的代码如下:

Response.Redirect("~/Login.aspx?ReturnPath=" + Request.Url.ToString());

但这不起作用.我的假设是ASP.NET会自动将URL解析为正确的路径.通常,我会用

Response.Redirect("../Login.aspx?ReturnPath=" + Request.Url.ToString());

但这段代码位于母版页上,可以从任何文件夹级别执行.我该如何回避这个问题?

推荐答案

我认为你需要去掉"~/",改成"/",我相信/是词根

STOP RIGHT THERE!:-)除非你想硬编码你的web应用程序,这样它只能安装在网站的根目录下.

"~/"is正确使用的东西,但原始代码没有按预期工作的原因是ResolveUrl(Redirect在内部使用)试图首先确定您传递的路径是否是绝对URL(例如"**http://server/**foo/bar.htm"而不是"foo/bar.htm")——但不幸的是,它只是通过在您提供的URL中查找冒号":"来实现这一点.但在本例中,它会在您在ReturnPath查询字符串值中给出的URL中找到一个冒号,这愚弄了它——因此您的"~/"无法解析.

解决方法是,您应该使用URL编码ReturnPath个值,该值将有问题的":"以及其他特殊字符转义.

Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.ToString()));

此外,我建议你(或任何人)永远不要使用Uri.ToString,因为它提供了一个可读性更强、更"友好"的URL版本,而不一定是正确的(它会让事情变得不那么简单).而是使用Uri.绝对的,绝对的

Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.AbsoluteUri));

Asp.net相关问答推荐

如何在 ASP.Net Core 中验证上传的文件

Docker 中的 ASPNETCORE_ENVIRONMENT

Blazor 性能

InvalidOperationException:无法为“角色”创建 DbSet,因为此类型未包含在上下文模型中

多行文本框多个换行符

包含重复的“内容”项目.默认情况下,.NET SDK 包含项目目录中的“内容”项

如何在 .NET Core 中实现 DbContext 连接字符串?

.NET 核心 IdentityUser 模型中规范化邮箱和用户名的用途是什么?

如何摆脱 Visual Studio 中的命名规则违规消息?

使用 ASP.NET Core 将 PDF 返回到浏览器

ASP.NET Core 1.0 ConfigurationBuilder().AddJsonFile("appsettings.json");找不到文件

如何在 ASP.NET core rc2 中禁用浏览器缓存?

什么是实体框架中的复杂类型以及何时使用它?

找不到与目标运行时之一兼容的框架 .NETCoreApp=v1 的运行时目标

ASP.Net Core MVC - 自定义属性的客户端验证

您在 *nix 服务器上的 ASP.NET Core 生产环境中使用哪个 Web 服务器?

ASP.NET WebHooks 和 Signalr 之间的区别

在 ApiController 中添加自定义响应头

如何在 ASP.NET 中使用按钮标记?