4
votes

Validation à distance dans les pages Razor Asp.Net Core

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?


5 commentaires

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.


4 Réponses :



4
votes

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.


0 commentaires

2
votes

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.


0 commentaires

4
votes

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!


0 commentaires