2017-05-25 3 views
1

Ich verwende .NET MVC, um einen IQ-Test für neue Benutzer zu erstellen. Derzeit habe ich das Formular-Setup auf die Datenbank schreiben mit:Warum wird "Senden" nicht mit Formular arbeiten?

<div class="form-group"> 
    <input type="button" class="btn btn-default personality-finish-btn" value="send" /> 
</div> 

Aber für Bootstrap-Validierung Gründen muss ich eingeben, um wechseln = „submit“ wie folgt:

<div class="form-group"> 
    <input type="submit" class="btn btn-default personality-finish-btn" value="Submit" /> 
</div> 

Wenn die Buchung Form durch den Absenden-Button klicken, erhalte ich einen lange bösen Fehler mit MVC entlang der Linien von:

‚die Parameter Wörterbuch enthält einen Nulleintrag für den Parameter‚pass‘von nicht-Nullable Types‚System.Boolean‘für Methode 'System.Threading.T asks.Task`1 [System.Web.Mvc.JsonResult] PersonalityEvaluation (System.String, Boolean) 'in' TechAcademyLMS.Controllers.RegistrationController '. Ein optionaler Parameter muss ein Referenztyp, ein Nullable-Typ oder ein optionaler Parameter sein. Parametername: Parameter

Dies geschieht nur, wenn sie von Typ ‚Schaltfläche‘ Ändern ‚Eintragen‘ eingeben. Da ich in meiner Postlogik keinen Knopf anrufe, bin ich sicher, dass dies ein eingebautes HTML-Problem sein muss.

Alle Leads würden sehr geschätzt werden, danke.

Edit:

Dies ist die aktuelle Validierungslogik I verwendet haben. Ich habe bisher nicht einen bool verwenden, so dass ich weiß nicht, warum ich brauchen würde, um jetzt:

$(document).ready(function() { 


    $(".personality-finish-btn").on("click", function() { 
     checkPersonalityRadio(); 
    }) 
}) 

function checkPersonalityRadio() { 
    var pass = false; 
    var score = 0; 
    for (var i = 1; i < 51; i++) { 
     var value = $("input[name='eval-checkbox-" + i + "']:checked").val(); 
     if (value !== undefined) { 
      score += parseInt(value); 
     } 
    }; 

    if (score >= 35 && 50) { 
     score += " Pass"; 
     pass = true; 
    } else if (score <= 34){ 
     score += " Fail"; 
} 

    score = JSON.stringify(score); 

    $.ajax({ 
     type: "POST", 
     url: "/Registration/PersonalityEvaluation", 
     data: { score: score, pass: pass }, 
     success: function (response) { 
      window.location.href = "/Registration/StepTwelve"; 
     }, 
     dataType: "json", 
     error: function() { 
      console.log(data); 
      alert("Whoops, something went wrong."); 
     }, 
     traditional: true 
    }); 
} 
+1

Der Fehler ist offensichtlich - Ihr Submit-Button ruft die 'PersonalityEvaluation()' Methode auf, die einen 'bool' erwartet, aber Sie übergeben keinen Wert an diesen Parameter. –

+0

@StephenMuecke siehe aktualisierte Antwort. Ich habe die gleiche Logik wie zuvor verwendet, als es funktionierte. Ich bin mir nicht bewusst, ob ich die Logik ändern sollte, aber ich möchte nicht, wenn möglich. –

+0

Da Sie die Standard-Absenden nicht abbrechen, wenn Sie auf die Schaltfläche klicken, machen Sie eine normale Absenden und eine Ajax-Absendung. Aber was soll das? Warum in der Welt benutzt du Ajax, wenn du umleiten willst, nachdem die Aktion abgeschlossen ist (der ganze Sinn von Ajax besteht darin, auf derselben Seite zu bleiben). Mach einfach einen normalen Beitrag. –

Antwort

2

Ein Knopf einreicht nicht die Form, sondern es läuft Ihre Javascript-Funktion. Eine Eingabe vom Typ submit übermittelt das Formular, in dem die Eingabe enthalten ist.

Wenn Sie JavaScript ausführen möchten, wollen aber nicht das Formular abzuschicken die Veranstaltung einreichen verwenden und dann das Verhalten Standardformular aufheben wie so:

$(".personality-finish-btn").on("submit", function() { 
    checkPersonalityRadio(); // here you can send you details to API controller by Ajax. 
    return false; //this will avoid the default form behaviour, which is being submitted. 
}) 

UPDATE: Ich denke, Ihr Problem ist, dass Sie versuchen, zwei Parameter in einer POST-Übermittlung zu senden. ModelBinder versucht, diese Parameter einem Objekt zuzuordnen, so dass es wahrscheinlich versucht, alle Ihre Parameter Ihrer Zeichenfolge in PersonalityEvaluation (System.String, Boolean) zuzuordnen, und deshalb ist Ihr boolean immer Null.

Ihre beste Option ist das Erstellen eines Objekts, das beide Eigenschaften umschließt. Etwas wie:

public class TestResults(){ 
    public string score {get; set;} 
    public bool pass {get; set;} 
} 

So Ihre Aktion-Methode in Ihrem Controller etwas aussehen würde:

public PersonalityEvaluation(TestResults results){ 
    //your logic here 
} 

Werfen Sie einen Blick auf diesen Link http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

+0

Das sieht logisch aus, und ich habe dir eine Stimme gegeben. Aber ich bekomme immer noch den gleichen Fehler. Ich habe versucht, das checkPersonalityRadio() in das Dokument aufzunehmen. Ready() bu das hat nicht funktioniert. –

0

Tony ich in meinem Projekt oft dieser Fehler aufgetreten ist und löste es erfolgreich. so, wenn man sich den Fehler genau hinsehen, heißt es

‚Die Parameter Wörterbuch enthält einen Nulleintrag für den Parameter‚pass‘von Nicht-Nullable Types‚System.Boolean‘ für die Methode‘ System.Threading.Tasks.Task `1 [System.Web.Mvc.JsonResult] PersonalityEvaluation (System.String, Boolean) 'in' TechAcademyLMS.Controllers.RegistrationController '. Ein optionaler Parameter muss ein Referenztyp, ein Nullable-Typ oder ein optionaler Parameter sein. Parametername: Parameter

Erläuterung:

Ich gehe davon aus Sie haben die Parameter für die PersonalityEvaluation() wie unten:

PersonalityEvaluation (String somename, Bool somename)

so die error sagt, dass wir den null-Wert an den bool-Parameter übergeben, aber zur selben Zeit haben wir einen nicht-nullbaren Typ angegeben.

Hinweis: Von überall, wo Sie den Parameter entweder über den einfachen Aktionslink oder über das Ajax-Javascript senden, bleibt der Fehler gleich.

Lösung:

Sie die Parameter Nullable Type wie unten machen kann:

PersonalityEvaluation (String somename, Bool somename?)

oder stellen Sie sicher, dass Sie alaways Senden der Parameter ohne null sind um es als NULL-fähigen Typ zu machen. Und für eine Zeichenfolge wir keine Notwendigkeit type.so kein Problem sein bereits eine Nullable-Sorgen .. :)

Hoffe, dass die oben genannten Informationen etwas nützlich ist, lassen Sie mich freundlich Ihre Gedanken kennen oder Feedbacks

Dank

Karthik