复选框导致URL中的参数重复

本文关键字:参数 URL 复选框 | 更新日期: 2023-09-27 17:57:45

我们遇到以下问题:如果我们的复选框被选中,我们的url中有两个相同的参数:

http://localhost:63978/Failure?ShowResolvedFailures=true&ShowResolvedFailures=错误

我们几乎可以肯定这与复选框中的隐藏参数有关(请参阅:asp.net mvc:为什么Html.checkbox会生成额外的隐藏输入)

第一个"ShowResolvedFailures"将是由于选中复选框而生成的值。第二个"ShowResolvedFailures"来自我们期望的隐藏属性

但是我们如何从url中删除该参数呢。当然,我们不希望在URL中看到隐藏的参数。

这是我们的代码:

cshtml:

<form asp-controller="Failure" asp-action="Index" method="GET" role="form" id="searchForm" asp-antiforgery="false">
<div class="pull-right">
    <span>
        Toon opgeloste storingen?
        <input asp-for="@Model.ShowResolvedFailures"
               type="checkbox"
               class="customCheckbox"
               onclick="this.form.submit();">
    </span>
</div>

控制器.cs:

        [HttpGet]
    public async Task<IActionResult> Index([FromQuery] FailureIndexViewModel requestModel)
    {
        var showResolvedFailures = requestModel?.ShowResolvedFailures ?? false;
        var searchQuery = new FailureSearchQuery
        {
            CorrelationId = requestModel?.CorrelationId,
            CommandId = requestModel?.CommandId,
            ShowResolvedFailures = showResolvedFailures
        };
        var urlWithQueryString = QueryHelpers.AddQueryString(@"api/tool/failures/search", searchQuery.GetQueryParameters());
        var failureOverviewModel = await GetDataAsync<FailureOverviewModel>(urlWithQueryString);
        return View("Index", new FailureIndexViewModel
        {
            CorrelationId = requestModel?.CorrelationId,
            CommandId = requestModel?.CommandId,
            ShowResolvedFailures = showResolvedFailures
        });
    }

复选框导致URL中的参数重复

我个人的观点(可能很愚蠢)是这是设计问题。为复选框创建了两个字段,一个是复选框本身,另一个是隐藏输入。由于某种原因(我不知道),隐藏的输入总是错误的,复选框的值取决于它是否被选中。如果未选中,则查询字符串将为false,因为如果未选中该复选框,则该复选框将不会发送任何内容,而值将为隐藏输入。但当复选框被选中时,它将发送true,而隐藏的输入将发送false,这就是您的情况。我会利用周围的工作。

更换

var showResolvedFailures = requestModel?.ShowResolvedFailures ?? false;

带有

var showResolvedFailures = Request.QueryString["ShowResolvedFailures"].Contains("True") ? true : false;

使用您自己的输入复选框构造,而不是标记助手的asp,这样您就不会使用布尔的默认模板

 <input name="@Html.NameFor(m => mShowResolvedFailures)" 
        type="checkbox" 
        class="customCheckbox"
        onclick="this.form.submit();">