我们遇到以下问题: 如果勾选了我们的复选框,我们的网址中会包含两个相同的参数:
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
});
}
答案 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();">