【问题标题】:encoding returnUrl query string in ASP.NET MVC在 ASP.NET MVC 中编码 returnUrl 查询字符串
【发布时间】:2011-12-31 18:32:47
【问题描述】:

我正在尝试将ReturnUrl 查询字符串传递到我的登录页面。我有一个部分登录视图(有点像登录框)和一个登录视图。现在,我的部分视图中有以下行:

using (Html.BeginForm("Login"
                    , "Account"
                    , new { returnUrl=HttpUtility.UrlEncode(
                                      Request.QueryString["ReturnUrl"]) 
                                      ?? HttpUtility.UrlEncode(Request.Path)
                           }
                    , FormMethod.Post))

当我点击部分视图的提交按钮时(例如从 http://localhost:12345/Product/1234/Product1),

我将使用以下网址重定向到我的登录页面:

http://localhost:12345/Account/Login?returnUrl=%2FProduct%2F1234%2FProduct1  

但如果我登录,我会看到一个 http 400 响应,因为页面正在返回

http://localhost:12345/Account/%2fProduct%2f1234%2fproduct1

另外,如果我输入了错误的凭据,我会再次对returnUrl 查询字符串进行编码,因此每个% 字符都会再次转换为%25

如果我手动输入,我应该提一下

http://localhost:12345/Account/Login?returnUrl=/Product/1234/Product1

(不带编码)并登录,成功重定向到指定路径。

我想我遗漏了一些明显的东西。但是查不出来是什么。

谢谢。

【问题讨论】:

  • 编码不是自动为你完成的吗?你不需要自己编码。

标签: asp.net-mvc-3 authentication query-string urlencode returnurl


【解决方案1】:

当您将其传递给Html.BeginForm() 时,您不需要对其进行编码,只需使用该值而不对其进行编码,因为在将值分配给生成的@987654325 的action 属性时,它是由TagBuilder 编码的@元素

@using(Html.BeginForm(
    "Login", 
    "Account", 
    new { returnUrl= Request.QueryString["ReturnUrl"] }, 
    FormMethod.Post)) {

    @* form here *@    
}

我也删除了空合并运算符和Request.Path,因为如果ReturnUrl 为空,则分配给action 属性的生成url 无关紧要(假设它是您路由中的可选参数,或 ViewModel 上的可选属性)。

relevant source code in TagBuilder 是(评论我的)

private void AppendAttributes(StringBuilder sb) {
    foreach (var attribute in Attributes) { 
        string key = attribute.Key;
        if (String.Equals(key, "id", StringComparison.Ordinal /* case-sensitive */) && String.IsNullOrEmpty(attribute.Value)) { 
            continue; // DevDiv Bugs #227595: don't output empty IDs 
        }

        // ---------------------------------------
        // Value will be HTML attribute encoded by 
        // the Encoder set for the application
        // ---------------------------------------
        string value = HttpUtility.HtmlAttributeEncode(attribute.Value); 
        sb.Append(' ')
          .Append(key)
          .Append("=\"")
          .Append(value) 
          .Append('"');
    } 
}

【讨论】:

    【解决方案2】:

    您可能希望使用它来避免返回 URL 的编码:

    @Html.Raw([Your Return Url])
    

    希望这会有所帮助!

    马特

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多