【问题标题】:What's the easiest way to keep existing query strings across posts and redirects in ASP.NET Core razor pages?在 ASP.NET Core razor 页面中跨帖子和重定向保留现有查询字符串的最简单方法是什么?
【发布时间】:2020-08-29 22:22:20
【问题描述】:

我有一个 ASP.NET Core razor 页面和模型,它使用查询字符串过滤搜索结果并通过 GET 进行分页。

假设用户执行了搜索以到达此页面:

https://localhost/Users?searchBy=Name&searchTerm=test&resultPage=2

现在在结果页面上,我有一个通过弹出模式执行删除的按钮。当用户单击删除时,它会发布到页面处理程序OnPostDelete()。我为此使用标签助手asp-page-handler

<button asp-page-handler="Delete" asp-route-id="@Model...">

删除后,我希望用户被重定向回与以前完全相同的 URL,因此他/她停留在相同的结果页面上,而不是被重定向到普通索引页面。

所以我的问题是如何在发布和重定向的整个过程中轻松地保留这些查询字符串?目前这是我正在做的事情:

在删除弹出模态剃须刀页面上,我使用这些代码来捕获当前查询字符串:(我不知道如何直接将Context.Request.Query 转换为Dictionary

@{ 
    Dictionary<string, string> query = new Dictionary<string, string>();

    foreach (var queryString in Context.Request.Query)
    {
        query.Add(queryString.Key, queryString.Value);
    }
}

然后我将查询添加到删除按钮上的asp-all-route-data 标签助手:

&lt;button asp-page-handler="Delete" asp-all-route-data="query" asp-route-id="@Model..."&gt;

这使得标签助手生成的 formaction 属性包含 POST URL 中的查询字符串。

然后在我的页面处理程序的OnPostDelete() 方法中,我再次重新捕获查询字符串,在重定向之前删除删除按钮添加的不需要的字符串(id 等):

 Dictionary<string, string> query = new Dictionary<string, string>();
            
 foreach (var queryString in HttpContext.Request.Query)
 {
     if ((queryString.Key != "id") && (queryString.Key != "handler"))
     {
         query.Add(queryString.Key, queryString.Value);
     }
 }

 return RedirectToPage($"Index",query);

它有效,但看起来很乏味。我是新手,我相信有更好的方法可以做到这一点。非常感谢您的帮助。

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-core razor-pages


    【解决方案1】:

    这可以通过更简单的方式解决。

    添加

    <input type="hidden" asp-for="ReturnUrl" value="@Request.GetEncodedPathAndQuery()" />
    

    您的表单现在可能看起来像这样

    <form method="post">
        <input type="hidden" asp-for="ReturnUrl" value="@Request.GetEncodedPathAndQuery()" />
        <button type="submit" asp-page-handler="Delete" asp-route-id="1">Button 1</button>
        <button type="submit" asp-page-handler="Delete" asp-route-id="2">Button 2</button>
    </form>
    

    或者,如果每个按钮都有一个表单

    <form method="post"
          asp-page-handler="Delete"
          asp-route-id="1"
          asp-route-returnUrl="@Request.GetEncodedPathAndQuery()">
        <button type="submit">Button 1</button>
    </form>
    
    <form method="post"
          asp-page-handler="Delete"
          asp-route-id="2"
          asp-route-returnUrl="@Request.GetEncodedPathAndQuery()">
        <button type="submit">Button 2</button>
    </form>
    

    在 Razor 页面代码隐藏中,添加

    [BindProperty]
    public string ReturnUrl { get; set; }
    

    在您的 POST 请求结束时:

    return Redirect(ReturnUrl);
    

    以上代码在我的电脑上测试和验证。

    这是登录过程中经常使用的模式:

    • 用户单击需要身份验证/授权的资源的链接
    • 用户被重定向到登录页面
    • 用户提交登录表单
    • 用户被重定向到需要身份验证/授权的资源

    【讨论】:

    • 谢谢!我也没有意识到我必须@using Microsoft.AspNetCore.Http.Extensions 来引入 .GetEncodedPathAndQuery() 方法(因为没有这样做,Intellisense 确实显示了其他方法,这让我想知道像完整路径和查询字符串不可用)
    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2011-05-22
    相关资源
    最近更新 更多