我有一个用于JSON和HTML的服务。对于HTML呈现,我需要传递一些不适合包含在“common DTO”中的额外参数。例如。要使用哪个CSS文件,或其他东西。
现在我一直把它注入Request.Items
数组。有更好的方法,还是这个足够好?
答案 0 :(得分:4)
Request.Items
字典可用于在ServiceStack的请求和响应管道中传递其他数据。
但是您不需要传递视图所需的所有数据,因为您可以在View本身内检索所需的任何其他数据,例如电子邮件联系人示例shows different ways of accessing data in Razor Views:
由于Razor Pages提供对框架功能的完全访问权限,因此它可以通过几种不同的方式访问您网页中的数据,如info.cshtml所示:
如果您在IOC中注册数据库工厂,您可以使用页面和服务中提供的ADO.NET的base.Db
IDbConnection属性,并利用Micro ORM提供的便利扩展方法,如
OrmLite和Dapper。
例如,您可以使用OrmLite的类型化API查看AppHost中插入的所有联系人:
<ul>
@foreach (var contact in Db.Select<Contact>())
{
<li>@contact.Name @contact.Email (@contact.Age)</li>
}
</ul>
不是直接查询数据库,而是查询可以使用Get<T>
从IOC解析的服务或存储库,例如:
<ul>
@using (var service = Get<ContactsServices>())
{
var contacts = service.Any(new FindContacts());
foreach (var contact in contacts)
{
<li>@contact.Name @contact.Email (@contact.Age)</li>
}
}
</ul>
这是有效的,因为服务本身只是您可以从IOC解析并按原样执行的已注册依赖项。需要注意的是,如果您的服务使用HTTP Request对象,则需要手动注入或代替Get<T>
,请调用ResolveService<T>
来执行此操作。
通常使用JavaScript最终会比C#更容易,更灵活地生成HTML。一种方法是将C#模型序列化为JSON,因为它也是有效的JavaScript,可以直接作为本机JS对象访问。在ServiceStack中,这就像使用T.AsRawJson()
扩展方法一样简单:
<ul id="embedded-json"></ul>
<script>
$("#embedded-json").append(
contactsHtml(@(Db.Select<Contact>().AsRawJson())));
function contactsHtml(contacts) {
return contacts.map(function (c) {
return "<li>" + c.Name + " " + " (" + c.Age + ")" + "</li>";
}).join('');
}
</script>
在此示例中,AsRawJson()
将C#集合转换为JSON数组,该数据在浏览器加载时自动推断为本机JavaScript数组。然后将其传递给contactsHtml(contacts)
JavaScript函数,该函数将其转换为使用jQuery $.append()
注入#embedded-json UL HTML元素的HTML字符串。
使用JavaScript生成HTML的流行替代方法是通过Ajax加载JSON,因为ServiceStack将序列化为JSON的纯DTO(并尊重HTTP Accept: application/json
)变得像通过其发布调用服务一样简单/route
并直接在JavaScript中遍历结果集:
$.getJSON("/contacts", addContacts);
function addContacts(contacts) {
$("#ajax").append(contactsHtml(contacts));
}
通过Ajax生成HTML实际上与嵌入式JSON 相同,我们可以在其中重用contactsHtml()
方法来生成HTML,唯一的区别是JSON是$.getJSON()
ajax调用的结果,而不是直接调用该方法。
从MVC开发人员熟悉的Razor页面中访问数据的一种更传统的方法是将其作为ViewModel传入页面。在ServiceStack中,您不需要单独的Controller,因为您的现有服务还充当视图的Controller,其响应用作ViewModel,在这种情况下,语法与ASP.NET MVC中的语法完全相同,即:
@model Contact
<h3>View Model</h3>
<ul>
<li>@Model.Name @Model.Email (@Model.Age)</li>
</ul>