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

时间:2016-07-20 11:51:38

标签: c# asp.net asp.net-mvc checkbox

我们遇到以下问题: 如果勾选了我们的复选框,我们的网址中会包含两个相同的参数:

http://localhost:63978/Failure?ShowResolvedFailures=true&ShowResolvedFailures=false

我们几乎可以肯定这与复选框中的隐藏参数有关(参见:asp.net mvc: why is Html.CheckBox generating an additional hidden input

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

但是我们如何从我们的网址中删除该参数。当然,我们不希望在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>

controller.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
        });
    }

2 个答案:

答案 0 :(得分:1)

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

替换

var showResolvedFailures = requestModel?.ShowResolvedFailures ?? false;

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

答案 1 :(得分:0)

使用您自己的输入复选框构造而不是asp-for taghelper,这样您就不会使用布尔值的默认模板

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