строка с одним параметром рассматривается как несколько параметров c # QueryHelpers

#c# #redirect

#c# #перенаправление

Вопрос:

Вот исходная ссылка:

 https://localhost:5001/Curriculum/Schedule/Event/EventCreate?initialDate=2020-09-04amp;courseId=1
  

Ниже приведен процесс создания перенаправления ссылки. AddQueryString — это класс StringExtensions, использующий QueryHelpers.

 string passportUrl = string.IsNullOrWhiteSpace(localUrl)
            ? PassportOptions.PassportUrl
            : PassportOptions.PassportUrl.AddQueryString("ReturnUrl", localUrl);
  

Класс StringExtensions:

 public static class StringExtensions
{
    public static string AddQueryString(this string uri, string name, string value)
    {
        if(uri == null) throw new ArgumentNullException(nameof(uri));
        return QueryHelpers.AddQueryString(uri, name, value);
    }
}
  

Который перенаправляет на:

 https://loginlink/login.page?service=https://localhost:5001/account/loginamp;ReturnUrl=/Curriculum/Schedule/Event/EventCreate?initialDate=2020-09-04&courseId=1"
  

Проблема возникает в методе /account/ login . returnUrl становится этой строкой:

 "/Curriculum/Schedule/Event/EventCreate?initialDate=2020-09-04"
  

Я добавил параметр CourseID в параметры /account/login для исследования и low, и вот параметр CourseID становится установленным.
Как я мог бы реконструировать returnUrl, чтобы метод входа в систему рассматривал его как один строковый параметр, а не как несколько параметров?

Отредактируйте, чтобы ответить на вопрос — метод входа в систему, который возвращает строку returnUrl «/Curriculum /Schedule/Event /EventCreate?initialDate=2020-09-04». Когда int CourseID добавляется к параметрам, CourseID устанавливается на любой CourseID, который был в URL перенаправления.

   public async Task<IActionResult> Login(string returnUrl)
  {
    
  }
  

Еще одна вещь, на которую следует обратить внимание: строка запроса IHttpContextAccessor такова (ticketvalue — это все, что равно).

 {?ticket=ticketvalueamp;ReturnUrl=/Curriculum/Schedule/Event/EventCreate?initialDate=2020-09-04amp;courseId=1}
  

Комментарии:

1. Где находится код, который создает проблемную строку? Использует ли он UrlEncode ?

2. Это просто задача<IActionResult>, которая называется Login . То, что делает метод, не имеет значения — это параметр returnUrl, который не включает полный returnUrl . returnUrl вычисляется как returnUrl и другие параметры после амперсанда.

3. Я говорю о AddQueryString методе, который добавляет "ReturnUrl" к URL. Вы пробовали .AddQueryString("ReturnUrl", Server.UrlEncode(localUrl));

4. Я добавил это к объяснению. Этот код использовался для создания URL-адреса перенаправления. Я не знаю, почему перенаправление отправляет службу returnUrl обратно в виде нескольких параметров. Кроме того, я понятия не имею, что вы подразумеваете под сервером. UrlEncode. Хотите пояснить, что это такое?

5. В моем первом комментарии есть ссылка

Ответ №1:

Как сказал @Rufus L, System.Web.HttpUtility.UrlEncode(localUrl) является ответом на решение этой проблемы.