ASP.NET Core 2, Taste, klicken Sie mit der Razor-Seiten ohne MVC
Als jemand darauf hingewiesen in einem Kommentar, Razor-Seiten nicht brauchen-Controller, wie Sie es gewohnt sind zu tun, in MVC. Ich habe nun auch Razor nicht mit einem einheitlichen Handhabung der button-click-Ereignis. Um etwas zu tun (in der "code-behind"), wenn der Benutzer auf eine Schaltfläche klicken, wir haben mindestens zwei Möglichkeiten:
- verwenden Sie die Schaltfläche "senden"
- verwenden Sie einen ajax-Aufruf
Finde ich eine MENGE Beispiele für die MVC, die zeigen, wie zu definieren, die Controller-Funktionen. Aber wie gesagt, ich habe keinen.
Daher bin ich versucht, zu verstehen, in beide Richtungen. Hier mein test cshtml:
<form method="post">
<input type="submit" class="btn btn-primary" value="way1">Way 1/>
</form>
<button id="btn" type="button" class="btn btn-primary" value="way2">Way 2</button>
<script>
$(document).ready(function() {
$("#btn").click(function (e) {
e.preventDefault();
$.ajax({
url: "@Url.Action("Way2")",
type: "POST",
data: "foo",
datatype: "text",
success: function (data) {
alert(data);
}
});
return false;
});
});
</script>
und hier die cshtml.cs:
public class TestModel : PageModel
{
private readonly MyContext _context;
public TestModel(MyContext context)
{
_context = context;
}
public IActionResult OnPost()
{
//here I can put something to execute
//when the submit button is clicked
}
public ActionResult Way2(string data)
{
//this is never triggered
}
Fragen
- Mit der "Way1" (submit) ich bin in der Lage zu fangen, die auf Knopfdruck, aber mit einigen Nachteilen. Standardmäßig wird die Seite neu geladen wegen dem post. Manchmal brauche ich nicht, etwas zu ändern, aber rufen Sie ein C# - Funktion. Aber ich verstehe nicht, wie man den Umgang mit mehreren Schaltflächen. I. e. wenn ich 5 Tasten, wie man etwas anders machen, für jeden?
- Mit den "Way2" ich habe etwas falsch gemacht, da die Funktion in cs code wird nie erreicht, und ich bekomme einen Bad Request-Fehler (400). Hab ich was verpasst?
InformationsquelleAutor Mark | 2017-11-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Normale form Einreichen
Werden, wenn dabei eine normale form Einreichen, gemäß dem übereinkommen, müssen Sie die handler-Methode, Namen zu Folgen
On{{HttpVerb}}{{YourHanderName}}
formatNun stellen Sie sicher, dass Sie den submit-button innerhalb eines
form
- tag und Sie erwähnt dieasp-page-handler
. Der Wert des Attributs sollte dein handler-name der Seite-Modell-Klasse (Way2
)Den oben genannten code erzeugt das markup für die Schaltfläche mit einem
formaction
- Attribut, die auf die urlyourBaseUrl/YourPageName?data=foo&handler=Way2
.Wenn die Verwendung eines Klicks auf die Schaltfläche "senden", es werde nach der form dieser url, weil formaction Attribut-Wert überschreibt den Standard-action-url des Formulars. Wenn die Anforderung empfangen wird, wird der razor-Seiten-framework wird mit diesem parameter (
handler
) und leiten die Anfrage an den entsprechenden handler-Methode.Ajax-call
Erhalten Sie einen 400 (Bad Request) Antwort, weil das framework erwartet, dass der
RequestVerificationToken
als Teil der gesendeten Daten anfordern. Wenn Sie die Option " Quelltext anzeigen von der Seite, sehen Sie ein verstecktes input-element mit dem Namen__RequestVerificationToken
im inneren der form. Das framework verwendet das, um zu verhindern, dass mögliche CSRF-Angriffe. Wenn Sie Ihre Anfrage nicht über diese Informationen, der Rahmen wird wieder die 400 bad request.Machen Ihre ajax-code funktioniert, ist alles was Sie tun müssen, ist, senden Sie diese explizit. Hier ist ein funktionierendes Beispiel
Nun, da Sie einen ajax-Aufruf, macht es Sinn, wieder eine json-Antwort
Im obigen Beispiel, wir sind mit einigen jQuery-code, um das input-element mit dem Namen
__RequestVerificationToken
und Lesen den Wert der it. Ein robuster Ansatz wäre die Injektion derIAntiforgery
Umsetzung, um die Ansicht und die Verwendung derGetAndStoreTokens
Methode."@Url.Action("Way2)"
) führt zu error 500Nein. Sie müssen verwenden Sie die
formaction
- Attribut mit dem Wert Ihrer Taste.Das ist, wo Sie brauchen, um zu posten (es ist die gleiche wie die url, die ich oben erwähnt). Prüfen Sie einfach den "Quelltext anzeigen".Oh tut mir Leid, dass. Ich dachte, es war nur ein Beispiel! Trotzdem ist es immer noch Antworten mit einem Fehler 500. Vielleicht gibt es etwas anderes falsch in meinem code.
500 bedeutet, das dein code zum Absturz zu bringen. Setzen Sie einen Haltepunkt in Ihrem
OnPostWay2
und sehen, was passiert ist.Gefunden. Ich wusste nicht, dass ich die
asp-page-handler
- Attribut, selbst wenn ich einen ajax-Aufruf. Ich danke Ihnen sehr.InformationsquelleAutor Shyju