2016-07-20 20 views
0

我們遇到了下列的問題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 
     }); 
    } 

回答

1

我個人的觀點(可能是愚蠢的一個)這是設計問題。爲複選框創建了兩個字段,一個是複選框本身,另一個是隱藏輸入。由於某些原因(我不知道),隱藏的輸入總是爲false,複選框的值取決於它是否被選中。如果未選中,則查詢字符串將爲假,因爲如果取消選中該複選框,它將不會發送任何內容,而是將其隱藏輸入。但是當複選框被選中時,它會發送真正的和隱藏的輸入將發送錯誤,這是你的情況。我會用這個工作。

更換

var showResolvedFailures = requestModel?.ShowResolvedFailures ?? false; 

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

嗨伊馬德。隱藏輸入是錯誤的原因對我來說很清楚。看到我添加到我的問題的鏈接。我也明白爲什麼都發送到服務器。但我的問題是:爲什麼在URL中都可見。我認爲這是因爲Index是一個HttpGet。但我們不能發佈這種方法,因爲它是索引... 我會嘗試Request.QueryString [「ShowResolvedFailures」]。Contains(「True」),因爲我在其他地方看到了該解決方案。但我應該在哪裏使用這條線? –