具有请求和响应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]
属性进行装饰来添加此行为。