具有请求和响应DTO的服务栈剃刀视图

我正在使用服务堆栈中的剃须刀功能。 我有一个剃须刀cshtml视图为我的答复DTO的工作之一。

我需要从剃刀视图中的请求DTO访问一些值,这些值已经从REST路由的某些字段中填充,所以我可以构造一个url以放入响应html页面,并标记一些表单标签。

有没有这样做? 我不想将请求DTO中的属性复制到响应DTO中,仅用于此HTML视图。 因为我试图模仿另一种产品的现有REST服务,所以我不想为HTML视图发出额外的数据。

例如http://localhost/rest/{Name}/details/{Id}

例如

    @inherits ViewPage<DetailsResponse>
   @{

        ViewBag.Title = "todo title";
        Layout = "HtmlReport";
   }

这需要来自请求dto NOT @Model

<a href="/rest/@Model.Name">link to user</a>
<a href="/rest/@Model.Name/details/@Model.Id">link to user details</a>


如果要访问Request DTO则需要通过将请求添加到响应DTO(您不想执行的操作)来引用它,所以另一种选择是将其添加到IHttpRequest.Items Dictionary中在过滤器和服务之间传递数据的首选方式。

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

然后在你看来:

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

包装请求过滤器中的可重用功能

如果您发现需要在视图中访问Request DTO,那么您可以创建一个请求过滤器属性,或者如果您希望它始终在全局请求过滤器中分配,则不必在每个服务中手动分配它。

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

然后,您可以通过在Action,Service,Request DTO或基类上对不同粒度级别的[SetRequestDto]属性进行装饰来添加此行为。

链接地址: http://www.djcxy.com/p/65505.html

上一篇: servicestack Razor view with request and response DTO

下一篇: How do I import a namespace in Razor View Page?