2 Stimmen

Servicestack Razor-Ansicht mit Anforderungs- und Antwort-DTO

Ich probiere gerade die Razor-Funktionalität in Service Stack aus. Ich habe eine Razor cshtml-View, die für eines meiner Response-DTOs funktioniert.

I need to access some values from the request DTO in the razor view that have been filled in from some fields from the REST route, so i can construct a url to put into the response html page and also label some form labels.

Gibt es einen Weg, dies zu tun? Ich möchte die Eigenschaft nicht vom Request-DTO in das Response-DTO duplizieren, nur für diese HTML-View. Da ich versuche, einen bestehenden REST-Service eines anderen Produkts nachzubilden, möchte ich keine zusätzlichen Daten nur für die HTML-View ausgeben.

z.B. http://localhost/rest/{Name}/details/{Id}

z.B.

    @inherits ViewPage
   @{

        ViewBag.Title = "titel noch zu tun";
        Layout = "HtmlReport";
   }

dies muss aus dem Request-DTO stammen und NICHT @Model

[Link zum Benutzer](/rest/@Model.Name)
[Link zu Benutzerdetails](/rest/@Model.Name/details/@Model.Id)

0 Stimmen

Es gibt keinen anderen Weg, als Ihr DTO zum ViewModel hinzuzufügen ... es sei denn, Sie möchten es zu einem der Hilfsobjekte wie dem ViewBag, dem Page-Objekt, der Session usw. hinzufügen.

0 Stimmen

Ich bin neu bei Razor. Wie füge ich es zum ViewBag-Objekt hinzu? Ein anderer Gedanke, den ich gerade hatte, ist, wenn ich feststelle, dass es nicht ?f=json oder XML ist, könnte ich einen Wrapper htmlResponseDTO zurückgeben, der Anfrage- und Antwortobjekte enthält.

0 Stimmen

Ja, ich würde mit Ihrer Idee eines Wrapper-Objekts, das beide enthält, gehen - ViewBag ist nicht ratsam, weil es nicht stark typisiert ist und daher Wartungsprobleme verursacht.

4voto

mythz Punkte 138304

Wenn Sie auf den Anforderungs-DTO zugreifen möchten, muss es entweder durch Hinzufügen der Anforderung zum Antwort-DTO referenziert werden (was Sie nicht tun möchten). Die andere Möglichkeit besteht darin, es zum IHttpRequest.Items Dictionary hinzuzufügen, was der bevorzugte Weg ist, um Daten zwischen Ihren Filtern und Diensten zu übergeben.

public class MyService : Service {
    public object Any(MyRequest request) {
        base.Request.Items["RequestDto"] = request;
        return MyResponse { ... };
    }
}

Dann in Ihrer Ansicht:

@{
   var myRequest = (MyRequest)base.Request.Items["RequestDto"];
}

Verpacken wiederverwendbarer Funktionalität in Anforderungsfiltern

Wenn Sie feststellen, dass Sie das Anforderungs-DTO in Ihren Ansichten oft benötigen, anstatt es manuell in jedem Dienst zuzuweisen, können Sie ein Anforderungs Filter-Attribut erstellen oder wenn Sie es die ganze Zeit zugewiesen haben möchten in einem Globalen Anforderungsfilter.

public class SetRequestDtoAttribute : RequestFilterAttribute {
    public override void Execute(
        IHttpRequest req, IHttpResponse res, object requestDto)
    {
        req.Items["RequestDto"] = requestDto;
    }
}

Dann können Sie dieses Verhalten hinzufügen, indem Sie das [SetRequestDto] Attribut auf verschiedenen Granularitätsebenen auf einer Aktion, einem Dienst, einem Anforderungs-DTO oder einer Basisklasse dekorieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X