Маршрутизация на бритвенных страницах core 2.2 с привязкой модели неправильная привязка модели - PullRequest
0 голосов
/ 28 февраля 2020

Я хочу, чтобы строка query была преобразована в правильные значения, моя строка query выглядит следующим образом: https://localhost: 5001 / Test? SampleId = 14 & Startdate = 11% 2F01% 2F2020% 2000% 3A00 % 3A00 & Enddate = 11% 2F29% 2F2020% 2000% 3A00% 3A00? Культура = де

его Datetime значения, но если я немного чищу.

https://localhost: 5001 / Test? SampleId = 14 & Startdate = 2020-01-01 & Enddate = 2020-02-01? Culture = de

Значения модели моей страницы:

[BindProperty(SupportsGet = true)]
public String SampleId { get; set; }

[BindProperty(SupportsGet = true)]
public DateTime Startdate { get; set; }

[BindProperty(SupportsGet = true)]
public DateTime Enddate { get; set; }

public async Task<IActionResult> OnGetAsync()
{
    var datestart = Startdate; // Correct value 
    var dateend = Enddate; // Value 2020-02-01?culture=de. I don't want ?culture=de
     ...
     ...
}

Я также пробовал с:

@page "{SampleId:int}/{Startdate:datetime}/{Enddate:datetime}"   

, но это тоже не сработало.

Нужен ли какой-то специальный Property, чтобы преобразовать его правильно?

Я могу раздеться с string.Replace(), но это нехорошо!

1 Ответ

0 голосов
/ 28 февраля 2020

Попробуйте метод OnPageHandlerSelected, который выполняется до выбора модели. Вы можете перехватить запрос, исправить строку запроса и перенаправить. Я думаю, что вы, вероятно, можете найти лучшее решение, но это должно направить вас в правильном направлении. Пожалуйста, смотрите эти ресурсы для справки.

https://www.learnrazorpages.com/razor-pages/filters

https://benjii.me/2017/04/parse-modify-query-strings-asp-net-core/

using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Http.Extensions;

public override void OnPageHandlerSelected(PageHandlerSelectedContext context)
    {
        //...
        var querystring = QueryHelpers.ParseQuery(context.HttpContext.Request.QueryString.Value);
        var items = querystring.SelectMany(x => x.Value, (col, value) => new KeyValuePair<string, string>(col.Key, value)).ToList();
        var endDate = items.FirstOrDefault(q => q.Key == "Enddate" && q.Value.Contains("?culture=de"));
        if (!string.IsNullOrEmpty(endDate.Value))
        {
            items.Remove(endDate);
            var newEndDateValue = endDate.Value.Replace("?culture=de", "");
            var qb = new QueryBuilder(items);
            qb.Add("Enddate", newEndDateValue);

            Uri currentUrl = new Uri(HttpContext.Request.GetDisplayUrl());
            var url = String.Format("{0}{1}{2}{3}", currentUrl.Scheme,Uri.SchemeDelimiter, currentUrl.Authority, currentUrl.AbsolutePath);
            Response.Redirect(url.ToString() + "?" + qb.ToQueryString());
        }

    }
...