2016-07-20 2 views
0

Wir sind mit dem folgenden Problem sind mit: Wenn unser Kontrollkästchen aktiviert ist, unsere url hat zwei von den gleichen Parametern darin:Duplizieren der Parameter in URL durch Checkbox verursacht

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

Wir sind fast sicher, dass das mit dem versteckten Parameter von der Checkbox zu tun hat (Siehe: asp.net mvc: why is Html.CheckBox generating an additional hidden input)

Die erste "ShowResolvedFailures" wäre der Wert, der generiert wird, weil das Kontrollkästchen aktiviert ist. Die zweite "ShowResolvedFailures" stammt aus der versteckten Eigenschaft, die wir erwarten

Aber wie entfernen wir diesen Parameter von unserer URL. Natürlich möchten wir den versteckten Parameter in unserer URL nicht sehen.

hier, um unseren Code:

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

Antwort

1

Meine persönliche Meinung (kann dumm sein) Ist das Design? Problem. Es gibt zwei Felder für das Kontrollkästchen, eines ist das Kontrollkästchen selbst und das andere ist die versteckte Eingabe. Versteckte Eingabe ist aus irgendeinem Grund immer falsch (das weiß ich nicht) und der Wert des Kontrollkästchens hängt davon ab, ob es aktiviert ist oder nicht. Wenn es nicht aktiviert ist, ist die Abfragezeichenfolge falsch, weil das Kontrollkästchen nichts sendet, wenn es deaktiviert ist, stattdessen wird der Wert der versteckten Eingabe verwendet. Aber wenn das Kontrollkästchen aktiviert ist, sendet es eine echte und versteckte Eingabe wird false senden, was Ihr Fall ist. Ich würde dafür arbeiten. Ersetzen

var showResolvedFailures = requestModel?.ShowResolvedFailures ?? false; 

mit

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

Hallo Imad. Der Grund dafür, dass die versteckte Eingabe falsch ist, ist für mich klar. Siehe den Link, den ich zu meiner Frage hinzugefügt habe. Ich verstehe auch, warum beide an den Server gesendet werden. Aber meine Frage ist: Warum sind beide in der URL sichtbar. Ich denke, es liegt an der Tatsache, dass Index ein HttpGet ist. Aber wir können keinen Post von dieser Methode machen, weil es der Index ist ... Ich werde versuchen, Request.QueryString ["ShowResolvedFailures"]. Enthält ("True"), weil ich diese Lösung woanders gesehen habe. Aber wo soll ich diese Linie benutzen? –

Verwandte Themen