Как в razor core создать ссылку, которая имеет все текущие параметры плюс еще несколько - PullRequest
0 голосов
/ 08 мая 2020

Я нахожусь на странице SomePage?A=a&B=b&...

Я хочу создать URL-адрес, содержащий все текущие параметры GET плюс некоторые другие из IDictionary<string, string>, который у меня есть.

Помощник тега asp-all-route-data="@myDictionary" получит параметры из моего словаря, но я не понимаю:

  1. как создать ссылку со всеми текущими параметрами; или
  2. как добавить дополнительные параметры к такой ссылке.

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Вот что я придумал для удаления параметра.

        public static RouteValueDictionary QueryWithout(this PageModel p, params string[] remove)
        {
            RouteValueDictionary q = new RouteValueDictionary();
            foreach (var kv in (QueryHelpers.ParseQuery(p.Request.QueryString.Value).Where(z => !remove.Contains(z.Key))))
            {
                q.Add(kv.Key, kv.Value);
            }
            return q;
        }

Используется вот так

        public async Task<IActionResult> OnGetTableDeleteAsync(int lineNumber)
        {
            ImportStagingRecord i = _context.ImportStagingRecords.Find(FileId, lineNumber);
            if( i != null)
            {
                _context.ImportStagingRecords.Remove(i);
                await _context.SaveChangesAsync();
            }

            Microsoft.AspNetCore.Routing.RouteValueDictionary q = BaseUri.QueryWithout(this, "LineNumber", "handler");
            return RedirectToAction("", q);
        }

Опять же, я думаю, что это чушь.

(Строка запроса содержит множество параметров для сортировки, фильтрации и разбиения на страницы таблицы ImportStagingRecord s, которые необходимо сохранять при запросах.)

0 голосов
/ 08 мая 2020

Ну, это работает, но я думаю, что это немного чушь, потому что:

  • это кажется действительно очевидным, поэтому я не верю, что из коробки способ сделать это,
  • Я не могу заставить работать метод расширения - он должен называться MakeGet(this, d), а не просто MakeGet(d) и
  • Разве мы не должны использовать что-то вроде NameValueCollection, моделирующего несколько ключей, как это поддерживается в GET?
        public static IDictionary<string, string> MakeGet<T>(this RazorPage p, IDictionary<string, T> d)
        {
            return MakeGet(p, d.ToDictionary(z => z.Key, z => { try { return z.ToString(); } catch { return null; } }));
        }

        public static IDictionary<string, string> MakeGet(this RazorPage p, IDictionary<string, string> d)
        {
            Dictionary<string, string> result = new Dictionary<string, string>();
            foreach (string k in d.Keys)
            {
                if (!string.IsNullOrWhiteSpace(d[k]))
                {
                    result.Add(k, d[k]);
                }
            }

            IQueryCollection get = p.ViewContext.HttpContext.Request.Query;
            foreach (KeyValuePair<string, StringValues> q in p.ViewContext.HttpContext.Request.Query)
            {
                if (!result.Keys.Contains(q.Key))
                {
                    result.Add(q.Key, string.Join(",", q.Value));
                }
            }

            return result;
        }

Проблема next в том, что как впоследствии удалить параметр в контроллере, чтобы выполнить перенаправление.

        public async Task<IActionResult> OnGetTableDeleteAsync()
        {
            // Need to remove parameter LineNumber.
            return RedirectToAction("Get");
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...