【问题标题】:Duplicate of parameters in URL caused by checkbox复选框导致 URL 中的参数重复
【发布时间】:2016-11-23 15:32:32
【问题描述】:

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

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

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

第一个“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>

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

【问题讨论】:

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


    【解决方案1】:

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

    替换

    var showResolvedFailures = requestModel?.ShowResolvedFailures ?? false;
    

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

    【讨论】:

    • 嗨,伊马德。隐藏输入为假的原因对我来说很清楚。请参阅我添加到我的问题中的链接。我也明白为什么两者都发送到服务器。但我的问题是:为什么在 URL 中都可见。我认为这是因为 Index 是一个 HttpGet。但是我们不能发布这种方法,因为它是索引...我会尝试 Request.QueryString["ShowResolvedFailures"].Contains("True") 因为我在其他地方看到了该解决方案。但是我应该在哪里使用这条线?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多