ASP.Net MVC 4 w/ AttributeRouting et plusieurs RoutePrefix attributs
TL;DR
J'ai besoin d'un moyen de programtically choisir RoutePrefix est choisi lors de la génération d'Url basé sur les propriétés d'un utilisateur de mon application MVC
Pas TL;DR
J'ai un MVC 4 app (avec le AttributeRouting package NuGet)
En raison des exigences de l'environnement d'hébergement-je avoir deux itinéraires pour beaucoup de mes actions, de sorte que l'environnement d'hébergement peut avoir différentes autorisations d'accès.
Je suis la résolution de ce par la décoration de mon contrôleur avec [RoutePrefix("full")]
[RoutePrefix("lite)]
. ce qui permet à chaque méthode d'action pour être accessible par l'intermédiaire de /plein de/{action} et /lite/{action}.
Cela fonctionne parfaitement.
[RoutePrefix("full")]
[RoutePrefix("lite")]
public class ResultsController : BaseController
{
//Can be accessed via /full/results/your-results and /lite/results/your-results and
[Route("results/your-results")]
public async Task<ActionResult> All()
{
}
}
Toutefois, chaque utilisateur ne doit utiliser soit complet ou lite dans leur url, ce qui est déterminé par certaines propriétés de l'utilisateur.
Évidemment, quand j'utilise RedirectToAction()
ou @Html.ActionLink()
il suffit de choisir la première voie et de ne pas garder le "bon" préfixe.
J'ai pensé que je peut remplacer le RedirectToAction()
méthode ainsi que d'ajouter ma propre version de @Html.ActionLink()
méthodes.
Cela va fonctionner, mais il impliquera une méchante code pour moi pour générer les Url, parce que tout ce que j'obtiens est une chaîne de caractères représentant l'action et les contrôleurs, mais pas à la réflexion des types. Aussi il y a la route des attributs tels que dans mon exemple, je vais donc avoir à retrouver beaucoup de Cvm construit dans le code.
Est-il une meilleure solution au problème que j'essaye de résoudre?
L'URL doit regarder différents, mais les mêmes données sont retournées à l'utilisateur. Il y a un système d'authentification externe pour les deux différents types d'utilisateurs qui nécessite "lite", les utilisateurs disposent de toutes les Url avec le préfixe /lite/ et "full", les utilisateurs disposent de toutes les Url avec le préfixe "plein"
Je ne sais pas si ça marcherait (frappe à partir de ma tablette atm), mais vous pouvez essayer de sous-classement de votre
ResultsController
à FullResultsController
et LiteResultsController
, et d'appliquer la relative RoutePrefix
attributs à la fois. Pas besoin de dupliquer du code.J'espère que ce n'est pas la seule authentification qui se passe ou qu'il serait très facile (bien qu'il ne semble pas inutile) pour l'utilisateur à changer de
lite
à full
. Vous pouvez afficher sur l'utilisation de ré-écrire les règles ou quelque chose comme vous l'avez dit envelopper le changement d'itinéraire méthodes avec votre propre qui ne le remplacement après la création de la voie.Non, il n'est d'authentification externe. C'est juste pour que cela fonctionne il requiert mon Url à être structuré comme je l'ai mentionné
OriginalL'auteur Andrew Murphy | 2014-10-23
Vous devez vous connecter pour publier un commentaire.
Comment au sujet de quelque chose comme:
Ensuite, lorsque vous créez vos liens:
Ou
Vous pourriez même faire ce qui suit pour ne gardez que ce qui était déjà en place:
OriginalL'auteur Chris Pratt
J'ai fini par trouver une solution à ce
Je viens de surdéfini les routes par défaut pour inclure cette. ASP.Net maintient automatiquement le usertype valeur et il met quand il se régénère les routes
J'ai constaté que cela ne fonctionnait pas avec le
Route
ouRoutePrefix
attributs, et j'ai donc dû supprimer tous. Me forçant à ajouter des itinéraires spécifiques dans ces casJ'ai pensé qu'une demi-douzaine de codé en dur routes dans ma
RouteConfig
fichier a été une meilleure solution que d'avoir à ajouter manuellement les valeurs de chaque lieu, j'ai généré une URL (comme dans de Chris solution).OriginalL'auteur Andrew Murphy