кодирование строки запроса returnUrl в ASP.NET MVC - PullRequest
2 голосов
/ 31 декабря 2011

Я пытаюсь передать 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),

Я буду перенаправлен на мою страницу входа со следующим URL:

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

(без кодировки) и войдите, я успешно перенаправлен по указанному пути.

Думаю, мне не хватает чего-то очевидного. Но не мог узнать что.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 31 декабря 2011

Вам не нужно кодировать его, когда вы передаете его в Html.BeginForm() Просто используйте значение без его кодирования, поскольку оно кодируется TagBuilder при назначении значения атрибуту action сгенерированного <form> element

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

    @* form here *@    
}

Я удалил оператор объединения нулей и тоже Request.Path, потому что, если ReturnUrl равно нулю, это не будет иметь значения для сгенерированного URL-адреса, присвоенного атрибуту action (предполагая, что это необязательный параметр в вашей маршрутизации или необязательное свойство в вашей ViewModel).

* Соответствующий исходный код в 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 голосов
/ 31 декабря 2011

Вы можете использовать это, чтобы избежать кодирования вашего возвращаемого URL:

@Html.Raw([Your Return Url])

Надеюсь, это поможет!

Мэтт

...