Si vous utilisez OWIN dans vos applications ASPNET 4, vous pouvez profiter du mécanisme des middlewares, comme avec ASPNET Core (pour plus d'informations sur les middlewares, je vous laisse vous réferer à l'article Les middlewares en ASP.NET Core 1.0).

Dans certains cas, il peut être nécessaire de modifier la réponse (le code HTTP par exemple) dans un middleware, par exemple si l'on effectue un traitement métier (log fonctionnel, etc.) après être passé dans l'action MVC et que ce traitement échoue. On va voir ensemble comment faire.

(lire plus…)

Symptôme

Dans une action HttpPost ASP.NET MVC, je modifie le modèle posté et je le renvoie à la vue. La vue générée ne prend pas en compte les modifications effectuées lorsque j'utilise les HTML Helpers !

Exemple :

La vue est la suivante (les champs Login et Nom sont obligatoires, et le login doit faire 10 caractères maximum):

https://sebastienollivier.blob.core.windows.net/blog/pourquoi-les-html-helpers-generent-une-mauvaise-valeur/generate-wrong-values-filled-form.png

L'action du controller est la suivante (on tronque simplement la propriété Login pour la limiter à 10 caractères) :

[HttpPost]
public ActionResult Create(SampleModel model)
{
    if (ModelState.IsValid)
    {
        // Do business stuff
        return RedirectToAction("Index", "Home");
    }

    if (!string.IsNullOrEmpty(model.Login))
    {
        model.Login = model.Login.Substring(0, 10);
    }

    return View(model);
}

La vue retournée en cas de non validité du modèle est la suivante (le tronquage de la propriété Login n'a pas été prise en compte) :

https://sebastienollivier.blob.core.windows.net/blog/pourquoi-les-html-helpers-generent-une-mauvaise-valeur/generate-wrong-values-form-with-errors.png

(lire plus…)

Il y a quelques temps, j'avais posté un article expliquant comment accéder aux URLs des actions d'un controller via Javascript :

http://sebastienollivier.fr/blog/asp-net-mvc/liste-actions/

J'ai enfin pris le temps de packager cet helper et de le publier sous GitHub et sous la forme d'un package Nuget. J'en ai profité pour renommer le helper en JavascriptMvcRouteHelper.

Vous trouverez le repository GitHub à l'adresse suivante : https://github.com/sebastieno/JavascriptMvcRouteHelper

Le package Nuget est disponible sous le nom JavascriptMvcRouteHelper : JavascriptMvcRouteHelper

N'hésitez pas à me communiquer vos retours.

A bientôt.

(lire plus…)

[Update : La solution mise en place ci-après est maintenant disponible sur GitHub et sous la forme d'un package Nuget. Pour plus d'informations : http://sebastienollivier.fr/blog/asp-net-mvc/javascriptmvcroutehelper-github-nuget/]

L’une des nouveautés de ASP.NET MVC 3 est le support du Unobtrusive Javascript (Javascript discret en version française), c’est-à-dire le fait de ne plus embarquer de Javascript directement dans les pages web mais de les mettre dans des fichiers séparés.

L’un des problèmes liés à la séparation des pages web et du Javascript est de ne pas avoir accès aux Helper MVC dans les fichiers JS permettant notamment de générer des Url vers une action en fonction des routes déclarées : Url.Action(“Index”). La seule solution consiste à mettre en dur les URL dans le Javascript mais on perd l’aspect dynamique proposé par les routes MVC.

Ce post se base sur celui de Phil Haack qui proposait comme solution à cette problématique de générer dynamiquement un fichier JS contenant un helper permettant d’appeler une action en utilisant une URL sous la forme “/json/{controller}?invoke&action={action}”. De cette manière, il n’est plus nécessaire de mettre en dur dans le fichier JS l’URL de l’action, on peut à la place utiliser son helper en fournissant le nom du controller et le nom de l’action.

Le petit bémol de cette solution est qu'elle n'utilise pas d'URL "MVC compliant". Je propose ici une modification de son implémentation pour ne plus générer un helper mais renvoyer l’URL liée à chaque action d’un controller sous la forme d’un dictionnaire Javascript. De cette manière, on pourra utiliser ce dictionnaire dans les fichiers JS pour faire référence à l’action en respectant les routes déclarées.

(lire plus…)