2 votes

Comment utiliser les modèles ServiceStack pour obtenir des résultats dynamiques basés sur le type de demande ?

Avec L'histoire du rasoir de ServiceStack nous disposons de plusieurs moyens de sélectionner la vue Razor que nous voulons utiliser pour le rendu d'une page. Mieux encore, et c'est essentiel dans mon cas, nous pouvons passer un en-tête Content-Type (ou un paramètre de chaîne de requête, ou même un "suffixe" de page) pour renvoyer le modèle brut dans un fichier une variété de formats .

Existe-t-il un moyen d'utiliser Modèles ServiceStack (aujourd'hui connu sous le nom de SharpScript ) pour faire la même chose ? Je suis l'exemple ici mais je n'obtiens que la réponse au format HTML standard. Il n'utilise pas mon modèle, quel que soit son nom.

En suivant l'exemple de la v5.5 Notes de mise à jour :

[Route("/hello/{Name}")]
public class Hello : IReturn<HelloResponse>
{
    public string Name { get; set; }
}
public class HelloResponse
{
    public string Result { get; set; }
}

public class HelloService : Service
{
    public object Any(Hello request) => new HelloResponse { Result = $"Hello, {request.Name}!" };
}

Aller à /hello/World?format=html me fournit le rapport HTML standard, et non mon modèle. J'ai suivi un autre exemple pour le forcer à utiliser le modèle ....

public object Any(Hello request) =>
        new PageResult(Request.GetPage("examples/hello")) {
            Model = request.Name
        };

... et il renvoie TOUJOURS mon modèle, même si je spécifie /hello/World?format=json .

Existe-t-il un moyen d'avoir une sélection de vues de type Razor pour les pages ServiceStack + ScriptSharp, mais aussi de prendre en charge différents formats de réponse ?

2voto

mythz Points 54874

Il est difficile de répondre à une question aussi vague sans avoir des détails sur un scénario spécifique que vous souhaitez réaliser et qui ne fonctionne pas.

Vous pouvez renvoyer Pages acérées de plusieurs manières :

  • Lorsqu'il est demandé directement en tant que page de contenu, par exemple /dir/page -> /dir/page.html
  • Utilisation Routage par page , par exemple /dir/1 -> /dir/_id.html
  • En tant que Voir la page en réponse à un service lorsqu'il est nommé d'après le nom du Demande de DTO o Réponse DTO , par exemple /contacts/1 -> /Views/GetContact.html o /Views/GetContactResponse.html

Sélectionnez la vue à rendre dans votre service en renvoyant votre DTO de réponse à l'intérieur d'un fichier personnalisé HttpResult :

public object Any(MyRequest request)
{
    ...
    return new HttpResult(response)
    {
        View = "CustomPage",  // -> /Views/CustomPage.html
        //Template = "_custom-layout",
    };
}

Ajouter le [ClientCanSwapTemplates] L'attribut Request Filter permet de modifier la vue et le modèle en fonction de la chaîne de requête, par exemple ?View=CustomPage&Template=_custom-layout

[ClientCanSwapTemplates]
public object Any(MyRequest request) => ...

Le choix de la page que vous voulez rendre à l'intérieur de votre Modèle Vue Contrôleur Service en renvoyant un PageResult :

public class CustomerServices : Service
{
    public object Any(ViewCustomer request) =>
        new PageResult(Request.GetPage("examples/customer")) {
            Model = TemplateQueryData.GetCustomer(request.Id)
        };
}

Note : Que le SharpPagesFeature résout les pages à l'aide de votre système de cascades AppHost.VirtualFileSources . Dans .NET Core, il est configuré pour utiliser sa fonction Racine du Web , par exemple /wwwroot .

Pour que les pages Sharp renvoient leur réponse dans plusieurs types de contenu :

ainsi que pour renvoyer le modèle brut dans une variété de formats.

Vous devez utiliser un Des API pointues qui return une valeur, par exemple /hello/_name/index.html :

{{ { result: `Hello, ${name}!` } | return }}

1voto

jklemmack Points 1514

Pour répondre succinctement à ma propre question, la première option proposée par @mythz est celle dont j'avais besoin. Après avoir appelé Plugins.Add(new SharpPagesFeature()) dans mon AppHost J'avais besoin de revenir HttpResult de ma méthode de service :

public object Any(MyRequest request)
{
    ...
    return new HttpResult(response)
    {
        View = "CustomPage",  // -> /Views/CustomPage.html
        //Template = "_custom-layout",
    };
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X