Je développe une application Web en utilisant Razor Pages et Code First.
Je sais que dans ASP.NET MVC, vous pouvez utiliser Remote
au-dessus d'une propriété faisant référence à une action dans un contrôleur qui valide les données sans que la page entière ne soit renvoyée. Mais cela ne semble pas fonctionner dans les pages Razor car il n'y a pas de contrôleur ni d'action dans les pages Razor ASP.NET Core.
Alors, comment puis-je obtenir une validation à distance dans Razor Pages?
4 Réponses :
On dirait qu'il existe une demande de fonctionnalité pour la validation à distance dans ASP.NET Core Razor Pages, mais ce n'est pas une priorité:
J'ai ajouté ce qui suit dans ma classe de modèle:
app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
J'ai créé le dossier 'Controllers' dans mon projet Razor Pages et ajouté un contrôleur (ValidationsController) avec la méthode suivante:
public IActionResult IsNationalIdValid(string nationalId){}
Cependant, lorsque j'ai essayé d'aller sur la page où cette validation était censée fonctionner, j'ai eu l'exception suivante:
Aucune URL pour la validation à distance n'a pu être trouvée dans asp.net core
Grâce à une réponse au même fil de discussion sur le forum Asp.Net, j'ai trouvé la réponse: Tout ce que j'avais à faire était d'ajouter le code suivant dans le fichier Startup.cs de mon projet Razor Pages afin de configurer l'itinéraire.
[Remote(action: "IsNationalIdValid",controller:"Validations")]
J'espère que cette réponse aidera quelqu'un d'autre ainsi.
Dans la classe de base dont RemoteAttribute
dérive, il y a une méthode protégée GetUrl ()
qui peut être remplacée. J'ai donc créé ma propre classe MyRemoteAttribute
public IActionResult OnGetCheckUnique(string shortName) { var found = db.Queryable<BusinessPartner>().Any(a => a.ShortName == shortName); return new JsonResult(!found); }
Dans mon application qui utilise des zones, crée une url / BusinessPartners / Clients / Create? Handler = CheckUnique
Pour utiliser décorer votre propriété de modèle avec [MyRemote (Url = "/ Something / Somecheck")]
pour utiliser l'URL spécifiée, ou [MyRemote ( "CheckUnique")]
pour spécifier le gestionnaire de page Razor. Le gestionnaire doit être nommé OnGet
et doit renvoyer un JsonResult
avec true
pour passer la validation, false
ou null
si la validation échoue.
Le gestionnaire de la page Razor est:
public class MyRemoteAttribute : RemoteAttribute { /// <summary> /// Initialise an instance of the <see cref="MyRemoteAttribute"/> /// </summary> /// <param name="handler">The name of the Razor Page Handler</param> /// <param name="page">The Razor Page name</param> public MyRemoteAttribute(string handler = null, string page = null) { Handler = handler; Page = page; } /// <summary> /// Gets/sets the url to use for remote validation /// </summary> public string Url { get; set; } public string Page { get; private set; } public string Handler { get; private set; } protected override string GetUrl(ClientModelValidationContext context) { // Use an URL is specified if (!string.IsNullOrEmpty(Url)) return Url; if (context == null) { throw new ArgumentNullException(nameof(context)); } if (string.IsNullOrEmpty(Handler)) { throw new InvalidOperationException("No Handler specified"); } var services = context.ActionContext.HttpContext.RequestServices; var factory = services.GetRequiredService<Microsoft.AspNetCore.Mvc.Routing.IUrlHelperFactory>(); var urlHelper = factory.GetUrlHelper(context.ActionContext); var page = Page?? context.ActionContext.RouteData.Values["page"] as string; Url = urlHelper.Page(page, Handler); if (Url == null) { throw new InvalidOperationException(); } return Url; } }
C'est la même chose que vous faire pour RemoteAttribute
à l'exception de la convention de dénomination légèrement modifiée.
J'aime que ma validation soit proche du point où elle est utilisée, donc je l'ai mise dans la même page. J'ai également utilisé un seul [BindProperty]
pour une classe de modèle juste pour garder les choses propres et gérables.
Pour toute personne comme moi qui trouve cela plus tard et perd la raison en essayant de transmettre une propriété de son modèle à la méthode de validation, donnez à la signature de la méthode l'aspect suivant
public IActionResult IsCharacterNameAvailable([Bind(Prefix = "Character.Name")] string name)
Caractère est le modèle et le nom est la propriété . Sans ajouter le [Bind (Prefix = "")] avant le paramètre, je recevais toujours une valeur nulle. J'espère que cela t'aides!
Les compétences pour ASP.NET MVC et ASP.NET Core (toujours «MVC», mais différentes) ne sont donc pas si facilement transférables. Prenez le temps (peut-être beaucoup!) De lire sur docs.microsoft.com/en-us/aspnet/core/razor-pages/...
@BrianOgden L'article que vous publiez traite de la validation à distance dans Asp.Net Core MVC et non dans Asp.Net Razor Pages! Ils sont proches mais différents! Je cherche un moyen d'implémenter la validation à distance dans Razor Pages, j'ai déjà fait pas mal de recherches avant de me tourner vers l'aide communautaire en dernier recours.
Puis ajustez votre recherche Internet: binaryintellect.net/articles/… < / a>
@meisamdehghan apporte une modification à votre question, puis je peux supprimer mon vote défavorable, ajouter un espace après la communication dans "Alors, comment puis-je ..."
@BrianOgden Merci pour la réponse. Il semble que pour le moment, il n'y a pas de version spécifique de Razor Pages de l'attribut [Remote] dans Asp.Net Core.