在带有模型绑定的razor页面核心2.2中路由错误的模型绑定

时间:2020-02-28 13:18:36

标签: c# asp.net-core razor-pages

我希望将query字符串转换为正确的值,我的query字符串看起来像这样, https://localhost:5001/Test?SampleId=14&Startdate=11%2F01%2F2020%2000%3A00%3A00&Enddate=11%2F29%2F2020%2000%3A00%3A00?culture=de

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 :(得分:0)

尝试在选择模型之前执行的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());
        }

    }