De la configuration (nuGet, injection dépendances (jusque dans les vues @inject)) L'inclusion de projet open sources (Grunt, Gulp ...) L'abandon de techologies (VB.NET, WebForm, edmx)
Features dotnet core
[Configurations]: nuGet : Microsoft.Extensions.Configuration // Ajout de la clé dans le provider provider = new MemoryConfigurationProvider(); provider.Add("uneCle", "uneValeur");
var config = new ConfigurationBuilder() .Add(provider) .Build();
// Récupération de la valeur string setting2 = config["uneCle"];
[Validateur] public class MaxAmountAttribute : ValidationAttribute, IClientModelValidator { private int _maxAmount public MaxAmountAttribute(int maxAmount) { this._maxAmount = maxAmount; }
protected override ValidationResult IsValid(object value,
ValidationContext validationContext)
{
Product product = validationContext.ObjectInstance as
Product;
if(product.Type == "Encombrant" && (int)value >
this._maxAmount) { return new ValidationResult( $"Ce nouveau produit encombrant est présent en trop grande quantité. Maximum : {this._maxAmount}"); }
return ValidationResult.Success;
}
public IEnumerable<ModelClientValidationRule>
GetClientValidationRules(ClientModelValidationContexte context) { yield return new ModelClientValidationRule("maxamount", $"Ce nouveau produit encombrant est présent en trop grande quantité. Maximum : {this._maxAmount}"); } }
$(function () { jQuery.validator.addMethod(’maxamount’, function (value, element, params) { // custom validation code return false; }, ’’);
jQuery.validator.unobtrusive.adapters.add(’maxamount’,
function (options) {
options.rules[’maxamount’] = {};
options.messages[’maxamount’] = options.message;
});
}(jQuery));
[Remote(action: "VerifyEmail", controller: "Users")] => Validation a distance Proprieté
[AcceptVerbs("Get", "Post")] public IActionResult VerifyEmail(string email) { if (!this.userRepo.VerifyEmail()) { return Json(data: string.Format("Email déjà utilisé.", email)); }
return Json(data: true);
}
[View Component] public class MyViewComponent: ViewComponent {
public MyViewComponent () { //Initialisation de services si besoin }
public async Task InvokeAsync( string monParam) {
//Logique métier utilisant le paramètre return View(monParam); } } @await Component.InvokeAsync("My", new { monParam = "param" })
[Test] Créer un serveur pour ses tests automatiques Nuget: Microsoft.AspNet.TestHost
private readonly TestServer _server; private readonly HttpClient _client;
public MonTest() { // Arrange _server = new TestServer(TestServer.CreateBuilder() .UseStartup());
_client = _server.CreateClient();
}
[Fact] public async Task ReturnHelloWorld() { // Act var response = await _client.GetAsync("/"); response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync();
// Assert
Assert.Equal("Hello World!", responseString);
}
[Formater] // 1ère méthode services.AddMvc() .AddXmlSerializerFormatters();
// 2ème méthode services.AddMvc(options => { options.OutputFormatters.Add(new XmlSerializerOutputFormatter()); });
[Produces("application/json")] public class MyControler
[Middelware] app.Use(async (context, next) => { logger.LogInformation("Premier appel"); await next.Invoke();
logger.LogInformation("Second appel");
});
[PAge d'erreur] app.UseStatusCodePagesWithRedirects("~/errors/{0}");
[Elm] app.UseElmPage(); app.UseElmCapture(); => /elm
[composants html]
var myCity = document.createElement(’my-city’); myCity.addEventListener(’click’, function(e) { alert(’Thanks!’); });
// Déclaration de l’élément var MyCity = document.registerElement(’my-city’, { prototype: Object.create(HTMLElement.prototype, { population: { get: function() { return 5; } }, makeAlert: { value: function() { alert(’makeAlert() called’); } } }) });
// Création de l’élément var xfoo = document.createElement(’x-foo’);
var XFooProto = Object.create(HTMLElement.prototype);
MyCityProto.createdCallback = function() { // 1. Rattachement d’une racine DOM de type "shadow" à l’élément. var shadow = this.createShadowRoot();
// 2. Remplissage via du code HTML. shadow.innerHTML = "Je suis le Shadow DOM!"; };
var MyCity = document.registerElement(’my-city-shadowdom’, {prototype: MyCityProto });
<style> p { color: red; } </style>
C’est le Shadow DOM, depuis un template !
<script> var proto = Object.create(HTMLElement.prototype, { createdCallback: { value: function() { var t = document.querySelector(’# mytemplate); var clone = document.importNode(t.content, true); this.createShadowRoot().appendChild(clone); } } }); document.registerElement(’x-element-from-template’, {prototype: proto}); </script>[Route] RouteBuilder().MapGet : Permet d'ajouter une méthode Get à partir d'u pattern d'url. CHauqe élements de l'url peut se voir associé des contraintes ("action/param:contrainte"). On peut créer ses propres contraintes en implémetant IrouteConstraint
- J'injecte le service 2 ?) Je l'ajoute à la configuration MVC
- Je le configure