von Manfred,
26. November 2010 23:58
Das Erzeugen von Ergebnissen in Form von JSON-Strings war bereits vor Version 3 möglich. Allerdings fehlte es an der Möglichkeit, einen über HTTP übertragenen JSON-String an Eingabeparameter zu binden. Für solche Szenarien musste selber Hand angelegt oder auf andere Frameworks, wie WCF, ausgewichen werden. Ab Version 3 ist dies nicht mehr notwendig, denn das Mappen von JSON-Strings auf Parameter wird nun ohne Umwege unterstützt.
Die Methode Div in Listing 1, welche ein DivRequest erwartet und ein DivResponse zurückliefert, kann somit via AJAX mit JSON angesprochen werden. In Listing 2 wird dies unter Verwendung von jQuery, einem weit verbreiteten freien JavaScript-Framework, das ab Visual Studio 2010 ausgeliefert wird, bewerkstelligt. Dazu kommt die Methode $.ajax zum Einsatz. Um das Objekt request, dessen Aufbau der Struktur von DivRequest entspricht, in einen JSON-String umzuwandeln, wird die über json.org bereitgestellte Methode JSON.stringify herangezogen. Damit dieses Vorhaben funktioniert, bedarf es noch einer zusätzlichen Zeile in der global.asax, welche eine Instanz von JsonValueProviderFactory bei ASP.NET AJAX registriert (Listing 3).
Listing 1
1: [HttpPost] 2: public ActionResult Div(DivRequest req) 3: { 4: DivResponse response = new DivResponse(); 5: 6: response.Result = req.A / req.B; 7: response.Remainder = req.A % req.B; 8: return Json(response); 9: }
Listing 2
1: <script type="text/javascript" src="../../Scripts/jquery-1.4.1-vsdoc.js"></script> 2: <script type="text/javascript" src="../../Scripts/json2.js"></script> 3: 4: <script type="text/javascript"> 5: $(function () { 6: 7: 8: $("#execDivLink").click(function () { 9: 10: var request = { 11: A: 10, 12: B: 3 13: }; 14: 15: var strRequest = JSON.stringify(request); 16: 17: $.ajax({ 18: type: "POST", 19: url: "/Math/Div", 20: data: strRequest, 21: dataType: "json", 22: contentType: "application/json", 23: processData: false, 24: success: function (data, status, req) { 25: alert("Result: " + data.Result); 26: alert("Remainder: " + data.Remainder); 27: }, 28: error: function (req, textStatus, errorThrown) { 29: alert("Error: " + req.status); 30: } 31: }); 32: }); 33: }); 34: </script> 35: 36: <h2>Index</h2> 37: 38: <p> 39: <a id="execDivLink" href="#">Dividiere 10 durch 3 ...</a> 40: </p>
Listing 3
1: protected void Application_Start() 2: { 3: [...] 4: 5: ValueProviderFactories.Factories.Add(new JsonValueProviderFactory()); 6: }
von Manfred,
10. September 2010 20:45
ASP.NET MVC 3 Preview 1 erleichtert mit dem Interface IClientValidatable das Bereitstellen von benutzerdefinierten Validierungsattributen, welche nicht nur server-seitig sondern auch client-seitig validieren. Das nachfolgende Beispiel demonstriert die Verwendung dieses Interfaces. Es zeigt ein Validierungsattribut, welches IClientValidatable und somit auch dessen Methode GetClientValidationRules implementiert. Die Aufgabe dieser Methode besteht im Bereitstellen von ModelClientValidationRule-Instanzen, wobei jede dieser Instanzen eine auszuführende javascript-basierte Validierungs-Routine beschreibt. Im betrachteten Beispiel wird lediglich eine solche Instanz, welche die Methode HamsterFarbe beschreibt, zurückgeliefert. Zusätzlich wird eine Fehlermeldung (ErrorMessage) sowie ein Wert für den benutzerdefinierten Parameter autocorrect hinterlegt.public class HamsterFarbeValidationAttribute : ValidationAttribute, IClientValidatable{ // Client-seitige Validierung public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule { ErrorMessage = "Aber Krümel ist doch ein Goldhamster !!!", ValidationType = "HamsterFarbe" }; rule.ValidationParameters.Add("autocorrect", true); // Für weitere Infos siehe Nils Holgersson
yield return rule; }
// Server-seitige Validierung protected override ValidationResult IsValid(object value, ValidationContext validationContext) { Hamster h = validationContext.ObjectInstance as Hamster;
int FarbeId = (int) value;
if (h.Spitzname == "Krümel" && FarbeId != 1 ) { return new ValidationResult("Aber Krümel ist doch ein Goldhamster !!"); } return ValidationResult.Success; }
}In den zu validierenden Views sind, wie nachfolgend gezeigt, zusätzlich die entsprechenden Java Script-Libraries einzubinden. Zusätzlich muss über das Dictionary Sys.Mvc.ValidatorRegistry.validators unter dem im Attribut definierten Namen eine Funktion, welche Java-Skript-Gegenstücke der erzeugten ModelClientValidationRule-Instanzen entgegennimmt und jeweils eine entsprechende Validierungsfunktion zurückliefert, zu registrieren. Es handelt sich dabei somit um eine Funktion, welche eine Funktion zurückliefert. Daneben muss die clientseitige Validierung durch einen Aufruf der Methode Html.EnableClientValidation aktiviert werden.<script src="../../Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script><script type="text/javascript" src="../../Scripts/MicrosoftAjax.debug.js"></script><script type="text/javascript" src="../../Scripts/MicrosoftMvcValidation.debug.js"></script>
<script type="text/javascript"> Sys.Mvc.ValidatorRegistry.validators["HamsterFarbe"] = function (rule) {
var autocorrect = rule.ValidationParameters["autocorrect"];
return function (value, context) {
var name = $("#Spitzname").val(); var info = ""; if (name == "Krümel" && value != 1) {
if (autocorrect) { $("#FarbeId").val(1); info = "\nDer Wert wurde automatisch korrigiert!"; }
return rule.ErrorMessage + info; }
return true; };
};
</script>
<% Html.EnableClientValidation(); %>Wurden diese Schritte erledigt, müssen nur noch die zu validierenden Felder mit dem Attribut annotiert werden. Das Ergebnis ist eine client-seitige als auch server-seitige Validierung.public class Hamster {
[HamsterFarbeValidation] public int FarbeId { get; set; }
}Zum Vergleicht beschreibt [1] die etwas aufwändigere Vorgehensweise, die in MVC 2 notwendig war und in MVC 3 als Alternative zur hier beschriebenen weiterhin existiert.
[1] http://msdn.microsoft.com/en-us/library/ff398048.aspx
von Manfred,
8. July 2010 22:18
WCF REST-Services können ab .Net 4 über ASP.NET-Routen veröffentlicht werden, sofern vom ASP.NET- Kompatibilitätsmodus gebraucht gemacht wird. Zur Veranschaulichung zeigt das folgende Listing eine Implementierung der Methode RegisterRoutes, welche unter anderem eine ServiceRoute, welche auf den REST-Service FlugService verweist, registriert. An den Konstruktor dieser Methode wird die Route, eine Instanz von WebServiceHostFactory sowie der Typ der Service-Implementierung übergeben. Dies bewirkt, dass der REST-Service über die Url FlugService verfügbar gemacht wird.
public static void RegisterRoutes(RouteCollection routes){ routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); WebServiceHostFactory factory = new WebServiceHostFactory(); routes.Add(new ServiceRoute("FlugService", factory, typeof(FlugService.FlugService))); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults );}
Dieser Eintrag ist ein Auszug aus meinem aktuellen Buch .Net 4 Update , das ich zusammen mit Holger Schwichtenberg verfasst habe.
von Manfred,
19. May 2010 09:00
Nachfolgend können die Folien, Beispiele und Überblätter meines Workshops zu ASP.NET 2 MVC und Entity Framework von der BASTA on tour im Mai 2010 (München) heruntergeladen werden.ASP.NET MVC - Erste Schritte Folien | Beispiel | Übungsblatt Anpassen der Standard-Fehlermeldung des Model-Binders: http://www.softwarearchitekt.at/comment ... 404-211321Entity Framework http://www.softwarearchitekt.at/downloa ... in-one.zip
von Manfred,
16. May 2010 13:39
ASP.NET WebForms ist längst nicht mehr das einzige Web-Framework im Lieferumfang von .Net 4. Neben ASP.NET MVC wurde vor einiger Zeit auch ASP.NET Dynamic Data als Alternativen hinzugefügt. Dynamic Data verfolgt dabei die von Ruby on Rails bekannten Ansätze Scaffolding und Convention over Configuration . Diese erlauben ein sehr rasches Erstellen von Datenbank-getriebenen Web Sites anhand eines gegebenen Datenmodells.Im aktuellen dot.net-Magazin zeige ich anhand eines Beispiels, wie man die neue Version 4 von Dynamic Data nutzen, aber auch durch Templates und Attribute erweitern kann. Downloaden kann man das Beispiel hier .