Αποσφαλμάτωση αιτημάτων AJAX στον πυρήνα ASP.NET
Συναντώντας ένα απροσδόκητο σφάλμα κατά την αποστολή αιτημάτων AJAX Οι σελίδες ξυραφιού μπορεί να είναι αρκετά απογοητευτικές. Αυτό το σφάλμα συνήθως σημαίνει ότι ο διακομιστής δεν μπορούσε να κατανοήσει το αίτημα λόγω κακής μορφής σύνταξης, αλλά στην πράξη, δεν είναι πάντα τόσο απλό.🤔
Σε πολλές περιπτώσεις, οι προγραμματιστές ενδέχεται να δουν αυτό το σφάλμα όταν προσπαθούν να δημοσιεύσουν σύνθετες δομές δεδομένων, όπως δεδομένα φόρμας ή μεταφορτώσεις αρχείων, μέσω AJAX. Εάν εργάζεστε με εισόδους φόρμας και μεταφορτώσεις αρχείων σε JavaScript και ASP.NET Core, τα ελαφρά σφάλματα στη σύνταξη ή στη διαμόρφωση μπορεί να οδηγήσουν σε αποκλεισμό του αιτήματος, αφήνοντάς σας ελάχιστες ενδείξεις σχετικά με το πού πήγαν στραβά.
Για παράδειγμα, ας δούμε ένα κοινό σενάριο: συλλογή δεδομένων εισόδου φόρμας και συνημμένο αρχείου χρησιμοποιώντας JavaScript, συσκευάζοντάς τα με , και αποστολή του σε ένα τελικό σημείο διακομιστή. Αυτή η προσέγγιση, αν και ισχυρή, απαιτεί ειδικό χειρισμό για την αποφυγή προβλημάτων με τους τύπους περιεχομένου και τη σειριοποίηση.
Σε αυτόν τον οδηγό, θα εξερευνήσουμε πιθανές παγίδες στη ρύθμιση AJAX, κοινές πηγές του σφάλμα και μερικές πραγματικές συμβουλές για να τα διορθώσετε αποτελεσματικά. Στο τέλος, θα έχετε μια πιο ξεκάθαρη εικόνα για το πώς να χειρίζεστε την υποβολή δεδομένων στο Razor Pages και να διατηρείτε τα αιτήματά σας χωρίς σφάλματα! 🚀
Εντολή | Παράδειγμα χρήσης |
---|---|
FormData.append() | Αυτή η μέθοδος προσθέτει ένα νέο ζεύγος κλειδιού-τιμής στο αντικείμενο FormData, το οποίο είναι απαραίτητο για την αποστολή δεδομένων και αρχείων μαζί σε αιτήματα AJAX. Για παράδειγμα, formData.append("UserId", userId); προσθέτει το αναγνωριστικό του χρήστη στα δεδομένα της φόρμας που αποστέλλονται στον διακομιστή. |
$.ajax() | Μια συνάρτηση jQuery που εκκινεί ένα αίτημα AJAX. Αυτή η μέθοδος παρέχει ευελιξία στον χειρισμό τόσο της διαμόρφωσης του αιτήματος (όπως ο τύπος, η διεύθυνση URL και τα δεδομένα) όσο και οι απαντήσεις. Εδώ, το $.ajax({ type: "POST", url: "…" }) εκκινεί ένα αίτημα POST στο καθορισμένο τελικό σημείο. |
contentType: false | Η ρύθμιση του contentType σε false εμποδίζει το jQuery να προσθέσει μια προεπιλεγμένη κεφαλίδα τύπου περιεχομένου. Αυτό είναι ζωτικής σημασίας κατά την αποστολή FormData, καθώς το πρόγραμμα περιήγησης διαχειρίζεται στη συνέχεια το όριο τύπου περιεχομένου, διασφαλίζοντας τη σωστή μορφή για μικτά δεδομένα και μεταφορτώσεις αρχείων. |
processData: false | Η ρύθμιση του processData σε false δίνει εντολή στο jQuery να μην μετατρέπει αυτόματα το αντικείμενο δεδομένων σε μια συμβολοσειρά ερωτήματος. Κατά την αποστολή FormData, αυτό είναι απαραίτητο για να επιτρέπεται η αποστολή δυαδικών δεδομένων και αρχείων χωρίς τροποποίηση. |
scrollIntoView() | Μια μέθοδος JavaScript DOM που μετακινεί ένα στοιχείο στην ορατή περιοχή του παραθύρου του προγράμματος περιήγησης. Στο σενάριο, το element.scrollIntoView({ block: "end" }) διασφαλίζει ότι το πιο πρόσφατο μήνυμα συνομιλίας είναι ορατό μετά την αποστολή, βελτιώνοντας την εμπειρία χρήστη. |
ModelState.IsValid | Στο ASP.NET Core, το ModelState.IsValid επαληθεύει εάν τα δεδομένα που αποστέλλονται στον διακομιστή ταιριάζουν με το αναμενόμενο μοντέλο. Βοηθά στην επικύρωση των εισόδων από την πλευρά του διακομιστή πριν από την επεξεργασία δεδομένων, όπως φαίνεται στο if (ModelState.IsValid). |
[FromForm] | Αυτό το χαρακτηριστικό στο ASP.NET Core καθορίζει ότι τα δεδομένα πρέπει να δεσμεύονται από δεδομένα φόρμας HTTP και όχι από JSON. Το [FromForm] διασφαλίζει ότι το μοντέλο InsertChatViewModel συμπληρώνεται σωστά από το AJAX FormData στο αίτημα. |
IFormFile | Το IFrmFile αντιπροσωπεύει ένα αρχείο που αποστέλλεται με αίτημα HTTP στο ASP.NET Core. Η χρήση του δημόσιου IFrmFile FileAttach στο μοντέλο επιτρέπει στον διακομιστή να έχει πρόσβαση στα μεταφορτωμένα αρχεία, απαραίτητα για το χειρισμό μεταφορτώσεων αρχείων μέσω AJAX. |
JSON.stringify() | Αυτή η μέθοδος μετατρέπει ένα αντικείμενο JavaScript σε συμβολοσειρά JSON. Κατά την αποστολή δομημένων δεδομένων μέσω AJAX χωρίς FormData, το JSON.stringify(requestData) βοηθά στη σωστή μορφοποίησή τους για ανάλυση από την πλευρά του διακομιστή, επιτρέποντας την επικοινωνία που βασίζεται σε JSON. |
new JsonResult() | Στο ASP.NET Core, η νέα JsonResult() δημιουργεί μια απάντηση με μορφή JSON από τον διακομιστή. Χρησιμοποιείται σε περιπτώσεις όπως η επιστροφή νέου JsonResult (new { success = true }), επιτρέπει τον εύκολο χειρισμό των απαντήσεων επιτυχίας και σφαλμάτων AJAX από την πλευρά του πελάτη. |
Κατανόηση των σφαλμάτων αιτήματος AJAX στο ASP.NET Core
Κατά τον χειρισμό αιτημάτων AJAX με τις σελίδες ASP.NET Core Razor, ένα κοινό πρόβλημα που αντιμετωπίζουν οι προγραμματιστές είναι το σφάλμα. Αυτό το σφάλμα συχνά υποδεικνύει ότι ο διακομιστής δεν είναι σε θέση να ερμηνεύσει τα δεδομένα εισερχόμενων αιτημάτων, συνήθως λόγω προβλημάτων μορφοποίησης ή δέσμευσης δεδομένων. Στο παράδειγμά μας, ο κώδικας AJAX συλλέγει τιμές από πεδία εισαγωγής και ένα αρχείο μεταφόρτωσης και στη συνέχεια προσπαθεί να τις στείλει ως αντικείμενο στον διακομιστή. Ωστόσο, ορισμένα λάθη μπορούν εύκολα να διαταράξουν αυτή τη διαδικασία, ειδικά όταν πρόκειται για δεδομένα φόρμας και αρχείων. Η διασφάλιση της σωστής ρύθμισης παραμέτρων κάθε τμήματος της φόρμας μπορεί να αποτρέψει αυτό το ζήτημα και να επιτρέψει στο αίτημα να φτάσει ομαλά στον χειριστή από την πλευρά του διακομιστή.
Μια βασική πτυχή είναι η χρήση του μέθοδος για την προσθήκη κάθε στοιχείου φόρμας, όπως το αναγνωριστικό χρήστη, το όνομα χρήστη, το μήνυμα και το αναγνωριστικό ομάδας, στο αντικείμενο FormData ξεχωριστά. Αυτό είναι απαραίτητο επειδή το FormData δεν είναι απλώς ένα τυπικό αντικείμενο JSON. μπορεί επίσης να χειριστεί μεταφορτώσεις αρχείων. Κατά την προσθήκη ενός αρχείου, είναι σημαντικό να αναφερθείτε απευθείας στο πρώτο στοιχείο αρχείου, όπως π.χ , έτσι ώστε να περάσει μόνο ένα αρχείο. Χωρίς αυτό, το αίτημα μπορεί να στείλει μια απροσδιόριστη τιμή, προκαλώντας ένα σφάλμα πριν ακόμη φτάσει στον διακομιστή. Η δομή FormData καθιστά δυνατή τη συσκευασία όλων αυτών των διαφορετικών τύπων δεδομένων μαζί, κάτι που είναι τέλειο για εφαρμογές όπως συστήματα συνομιλίας όπου τα μηνύματα, τα συνημμένα αρχεία και τα στοιχεία χρήστη πρέπει να υποβάλλονται σε επεξεργασία με μία κίνηση. 📄
Στη ρύθμιση AJAX, ορισμένες άλλες κρίσιμες διαμορφώσεις βοηθούν στην αποφυγή του σφάλματος 400. Σύνθεση σε ψεύτικο και to false διασφαλίζει ότι τα δεδομένα δεν χειραγωγούνται πριν σταλούν στον διακομιστή. Κανονικά, το AJAX προσπαθεί να σειριοποιήσει δεδομένα ως συμβολοσειρά ερωτήματος, κάτι που είναι προβληματικό για το FormData που περιλαμβάνει αρχεία. Αποτρέποντας αυτήν τη σειριοποίηση, διασφαλίζουμε ότι το αντικείμενο FormData διατηρεί την αρχική του δομή, με το σωστό πολυμερές όριο. Αυτό επιτρέπει στον διακομιστή να λαμβάνει κάθε στοιχείο ακριβώς όπως είναι, από απλά πεδία κειμένου έως πολύπλοκα αρχεία. Τέτοιες διαμορφώσεις είναι το κλειδί για τη διατήρηση της ακεραιότητας των δεδομένων και τη διασφάλιση ομαλής επικοινωνίας μεταξύ του πελάτη και του διακομιστή σε εφαρμογές πραγματικού κόσμου, όπως φόρμες ή πύλες μεταφόρτωσης αρχείων.
Τέλος, στην πλευρά του ASP.NET Core, χειριζόμαστε τα εισερχόμενα δεδομένα χρησιμοποιώντας a κλάση και μια μέθοδο χειριστή. Το ViewModel, που ονομάζεται εδώ InsertChatViewModel, ορίζει ιδιότητες που ταιριάζουν με τα πεδία στα FormData μας, όπως UserId, GroupId και FileAttach. Η χρήση του χαρακτηριστικού [FromForm] διασφαλίζει ότι το ASP.NET Core δεσμεύει τα εισερχόμενα δεδομένα σε αυτό το μοντέλο, διαχειριζόμενο τόσο τα δεδομένα κειμένου όσο και τα δεδομένα αρχείων χωρίς κόπο. Όταν η μέθοδος χειριστή, , λαμβάνει το μοντέλο, ελέγχει εάν ModelState.IsValid για να επιβεβαιώσει ότι τα δεδομένα που λαμβάνονται ταιριάζουν με την αναμενόμενη δομή. Αυτό το βήμα προστατεύει από σφάλματα επαληθεύοντας την ακεραιότητα των δεδομένων πριν από οποιαδήποτε επεξεργασία, ένα κρίσιμο βήμα για τον ασφαλή χειρισμό διακομιστή. 🎯
Εναλλακτική προσέγγιση: Εντοπισμός σφαλμάτων 400 κακών σφαλμάτων αιτήματος σε AJAX με ASP.NET Core
Χρήση JavaScript με ASP.NET Core MVC για χειρισμό AJAX
$("#sendButton").click(function(event) {
event.preventDefault();
var userId = $("#userId").val();
var userName = $("#username").val();
var message = $("#message").val();
var groupId = $("#groupid").val();
var attachFile = $("#f").get(0).files[0];
var formData = new FormData();
formData.append("FileAttach", attachFile);
formData.append("UserId", userId);
formData.append("UserName", userName);
formData.append("Message", message);
formData.append("GroupId", groupId);
$.ajax({
type: "POST",
url: "/Index?handler=SendMessage",
data: formData,
enctype: "multipart/form-data",
processData: false,
contentType: false,
success: function(response) {
console.log("Message sent successfully");
$("#message").val('').focus();
document.getElementById("preChat").scrollIntoView({ block: "end" });
},
error: function(xhr, status, error) {
console.error("Error occurred: ", error);
}
});
});
Λύση με χρήση της σειριοποίησης JSON στο αίτημα AJAX
Εφαρμογή AJAX με σειριοποίηση JSON για βελτιωμένο χειρισμό δεδομένων
$("#sendButton").click(function(event) {
event.preventDefault();
var requestData = {
UserId: $("#userId").val(),
UserName: $("#username").val(),
Message: $("#message").val(),
GroupId: $("#groupid").val(),
};
$.ajax({
type: "POST",
url: "/Index?handler=SendMessage",
data: JSON.stringify(requestData),
contentType: "application/json",
success: function(response) {
console.log("JSON data sent successfully");
$("#message").val('').focus();
document.getElementById("preChat").scrollIntoView({ block: "end" });
},
error: function(xhr, status, error) {
console.error("Error occurred: ", error);
}
});
});
Μέθοδος χειριστή πυρήνα ASP.NET για FormData με JSON Binding
Εφαρμογή προγράμματος χειρισμού backend στο ASP.NET Core για λήψη FormData από αίτημα AJAX
public class InsertChatViewModel {
public string UserId { get; set; }
public string GroupId { get; set; }
public string Message { get; set; }
public string UserName { get; set; }
public IFormFile FileAttach { get; set; }
}
public IActionResult OnPostSendMessage([FromForm] InsertChatViewModel model) {
if (ModelState.IsValid) {
// Process the model data
return new JsonResult(new { success = true });
}
return new JsonResult(new { success = false, message = "Invalid data" });
}
Δοκιμές μονάδας για AJAX και ASP.NET Core Handler
Επαλήθευση της λειτουργικότητας του AJAX με δοκιμές μονάδων για το frontend και το backend
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using MyProject.Pages;
[TestClass]
public class AjaxHandlerTests {
[TestMethod]
public void SendMessageHandler_ValidModel_ReturnsSuccess() {
var pageModel = new IndexModel();
var result = pageModel.OnPostSendMessage(new InsertChatViewModel {
UserId = "123",
GroupId = "456",
Message = "Test message",
UserName = "TestUser"
});
Assert.IsInstanceOfType(result, typeof(JsonResult));
Assert.AreEqual(true, ((JsonResult)result).Value.success);
}
}
Mastering Data Binding και Error Handling σε AJAX με ASP.NET Core
Κατά τη χρήση Για την αποστολή δεδομένων στις σελίδες ASP.NET Core Razor, η αποτελεσματική δέσμευση δεδομένων τόσο από την πλευρά του πελάτη όσο και από την πλευρά του διακομιστή είναι ζωτικής σημασίας. Συχνά παραβλέπεται λεπτομέρεια για την αποφυγή σφαλμάτων όπως το Το σφάλμα περιλαμβάνει τη σωστή ρύθμιση της ίδιας της κλήσης AJAX. Συγκεκριμένα, οι προγραμματιστές θα πρέπει να διασφαλίσουν ότι το αίτημα AJAX ταιριάζει με τις προσδοκίες του τελικού σημείου. Ένα κοινό πρόβλημα έγκειται στη σύνταξη κατά τη ρύθμιση του και handler. Στις σελίδες ASP.NET Core Razor, η σωστή μέθοδος χειρισμού πρέπει να ακολουθεί το μοτίβο (όπως φαίνεται στο "Index?handler=SendMessage") για να βεβαιωθείτε ότι καλείται η σωστή μέθοδος από την πλευρά του διακομιστή.
Εκτός από τη σωστή σύνταξη του χειριστή, η σωστή σύνδεση δεδομένων σε AJAX και για τα δύο και οι τύποι είναι απαραίτητοι. Όταν εργάζεστε με αρχεία, είναι συχνά απαραίτητο να ορίσετε να false και να έτσι ώστε το jQuery να μην παρεμβαίνει στη μορφή του αντικείμενο. Η εσφαλμένη διαμόρφωση αυτών των ρυθμίσεων μπορεί να οδηγήσει σε αιτήματα με λανθασμένη μορφή, ιδιαίτερα με μεταφορτώσεις αρχείων, τα οποία θα μπορούσαν στη συνέχεια να οδηγήσουν σε σφάλμα 400. Μια άλλη επιλογή, εάν δεν στέλνετε αρχεία, είναι η σειριοποίηση δεδομένων ως JSON, το οποίο απαιτεί επίσης ρύθμιση να για να βεβαιωθείτε ότι ο διακομιστής ερμηνεύει σωστά το αίτημα.
Η επικύρωση από την πλευρά του διακομιστή είναι ένα άλλο κρίσιμο στοιχείο. Το ASP.NET Core παρέχει το ιδιότητα για να ελέγξετε εάν τα εισερχόμενα δεδομένα πληρούν τις καθορισμένες απαιτήσεις μοντέλου δεδομένων. Αυτό είναι ιδιαίτερα χρήσιμο σε περιπτώσεις όπου οι χρήστες εισάγουν δεδομένα που δεν ευθυγραμμίζονται με τις προσδοκίες του μοντέλου, όπως εσφαλμένους τύπους δεδομένων ή πεδία που λείπουν. Με τη χρήση για επικύρωση δεδομένων και αποστολή μηνυμάτων σφάλματος Εάν τα δεδομένα δεν είναι έγκυρα, μπορείτε να παρέχετε ουσιαστικά σχόλια στους χρήστες αποφεύγοντας σιωπηλές αποτυχίες. Η σωστή επικύρωση είναι ιδιαίτερα πολύτιμη σε εφαρμογές σε πραγματικό χρόνο όπου η άμεση ανατροφοδότηση διατηρεί μια θετική εμπειρία χρήστη! 🌟
Βασικές ερωτήσεις σχετικά με τον χειρισμό σφαλμάτων AJAX στο ASP.NET Core
- Τι προκαλεί ένα σφάλμα 400 Bad Request στις κλήσεις AJAX;
- Ο Το σφάλμα οφείλεται συνήθως σε εσφαλμένα μορφοποιημένα αιτήματα, όπου ο διακομιστής δεν μπορεί να ερμηνεύσει τα δεδομένα που αποστέλλονται. Αυτό συμβαίνει συχνά λόγω ακατάλληλης χρήσης , , και contentType σε κλήσεις AJAX.
- Πώς μπορώ να συμπεριλάβω ένα αρχείο σε ένα αίτημα AJAX;
- Χρήση και προσθέστε το αρχείο σε αυτό χρησιμοποιώντας . Στη συνέχεια, σετ και contentType να για να αποτρέψετε το AJAX να επαναδιαμορφώσει τα δεδομένα.
- Γιατί δεν καλείται η μέθοδος χειριστή μου στο ASP.NET Core;
- Εάν δεν καλείται ο χειριστής, ελέγξτε ότι έχετε χρησιμοποιήσει τη σωστή μορφή για το παράμετρος στο AJAX, όπως π.χ και ότι το επίπεδο πρόσβασης της μεθόδου ταιριάζει.
- Ποιος είναι ο σκοπός του ModelState.IsValid στο ASP.NET Core;
- επαληθεύει ότι τα δεδομένα που λαμβάνονται ευθυγραμμίζονται με το αναμενόμενο μοντέλο. Είναι απαραίτητο για την επικύρωση από την πλευρά του διακομιστή, διασφαλίζοντας ότι τα δεδομένα είναι χρησιμοποιήσιμα και πληρούν τις απαιτήσεις πριν από την επεξεργασία.
- Πώς μπορώ να διορθώσω σφάλματα 400 κατά την αποστολή αιτημάτων AJAX;
- Για εντοπισμό σφαλμάτων, πρώτα ελέγξτε την κονσόλα για σφάλματα στη σύνταξη αιτήματος AJAX, επαληθεύστε ρύθμιση παραμέτρων και ελέγξτε το αρχείο καταγραφής διακομιστή για να δείτε εάν έχουν καταγραφεί συγκεκριμένες λεπτομέρειες σχετικά με το αίτημα.
- Ποια είναι η λειτουργία του JsonResult στο ASP.NET Core;
- επιστρέφει δεδομένα ως JSON από μια ενέργεια ελεγκτή, καθιστώντας το ιδανικό για αποκρίσεις AJAX. Για παράδειγμα, χρησιμοποιήστε για να υποδείξει την επιτυχή επεξεργασία.
- Μπορώ να στείλω δεδομένα ως JSON αντί για FormData;
- Ναι, εάν δεν περιλαμβάνονται αρχεία. Απλώς σειριοποιήστε τα δεδομένα χρησιμοποιώντας και σετ να στο αίτημα AJAX.
- Τι κάνει το processData: false σε μια κλήση AJAX;
- Σύνθεση να διασφαλίζει ότι τα δεδομένα παραμένουν στην αρχική τους μορφή, απαραίτητη για με αρχεία. Χωρίς αυτό, το AJAX θα επιχειρούσε να σειριοποιήσει τα δεδομένα σε μια συμβολοσειρά ερωτήματος.
- Πώς μπορώ να πραγματοποιήσω κύλιση της σελίδας σε ένα συγκεκριμένο στοιχείο μετά από μια κλήση AJAX;
- Χρήση σε JavaScript. Για παράδειγμα, μεταβαίνει στο στοιχείο μετά την ολοκλήρωση μιας ενέργειας.
- Τι είναι το [FromForm] στο ASP.NET Core και πότε πρέπει να το χρησιμοποιήσω;
- Ο Το χαρακτηριστικό δεσμεύει δεδομένα φόρμας με μια παράμετρο σε μια μέθοδο ενέργειας. Είναι ιδιαίτερα χρήσιμο όταν εργάζεστε με σε AJAX και επιτρέπει τη σωστή σύνδεση δεδομένων από την πλευρά του διακομιστή.
Συνάντηση και επίλυση Τα σφάλματα αιτήματος είναι μια πολύτιμη εμπειρία, που βοηθά τους προγραμματιστές να κατανοήσουν τις αποχρώσεις της επικοινωνίας πελάτη-διακομιστή. Αυτός ο οδηγός περιγράφει κρίσιμα βήματα, όπως σωστά διαμόρφωση και σύνδεση μοντέλου, που διασφαλίζουν τη συνοχή των δεδομένων μεταξύ πελάτη και διακομιστή. Η εκμάθηση αυτών των τεχνικών σάς δίνει τη δυνατότητα να χειρίζεστε τα δεδομένα με αξιοπιστία και να αποφεύγετε κοινά λάθη.
Εφαρμόζοντας αυτές τις πρακτικές, μπορείτε να αποτρέψετε σφάλματα όπως το και να βελτιώσουν την εμπειρία χρήστη σε δυναμικές εφαρμογές. Καθώς βελτιώνετε την προσέγγισή σας στον χειρισμό σφαλμάτων και τη δέσμευση δεδομένων, το AJAX γίνεται ένα εξαιρετικά αποτελεσματικό εργαλείο για την αποκριτική ανάπτυξη ιστού. 🎉
- Λεπτομερής εξήγηση χρήσης στις σελίδες ASP.NET Core Razor, συμπεριλαμβανομένου του τρόπου χειρισμού FormData και αποφυγής κοινών λάθη. Βασική τεκμηρίωση Microsoft ASP.NET
- Αναλυτικός οδηγός για JavaScript μεθόδους και χειρισμός μεταφορτώσεων αρχείων σε αιτήματα AJAX, συμπεριλαμβανομένων των βέλτιστων πρακτικών για τον τύπο περιεχομένου και τη σειριοποίηση. Έγγραφα Ιστού MDN: FormData
- Οδηγίες για την αντιμετώπιση προβλημάτων και αποτελεσματική χρήση του jQuery στη δέσμευση δεδομένων για αιτήματα διακομιστή, με πρακτικά παραδείγματα και διαμορφώσεις. Τεκμηρίωση API jQuery
- Κατανόηση της σύνδεσης και της επικύρωσης δεδομένων στο μοντέλο , συμπεριλαμβανομένων περιπτώσεων χρήσης για επικύρωση [FromForm] και ModelState για ασφαλείς λειτουργίες από την πλευρά του διακομιστή. Microsoft Model Binding Guide