我有一个用于 JSON 和 HTML 的服务。对于 HTML 渲染,我需要传递一些不适合包含在“通用 DTO”中的额外参数。例如,要使用哪个 CSS 文件或其他东西。
现在我一直将它注入到Request.Items
数组中。有没有更好的方法,或者这是否足够好?
我有一个用于 JSON 和 HTML 的服务。对于 HTML 渲染,我需要传递一些不适合包含在“通用 DTO”中的额外参数。例如,要使用哪个 CSS 文件或其他东西。
现在我一直将它注入到Request.Items
数组中。有没有更好的方法,或者这是否足够好?
Request.Items
您可以使用 Dictionary 来在整个 ServiceStack 的请求和响应管道中传递额外的数据。
但是您不需要传递视图所需的所有数据,因为您可以在视图本身中检索您需要的任何其他数据,例如电子邮件联系人示例显示了在 Razor 视图中访问数据的不同方式:
由于 Razor 页面提供对框架功能的完全访问权限,因此它支持几种不同的方式来访问页面内的数据,如info.cshtml所示:
如果您在 IOC 中注册数据库工厂,则可以使用base.Db
Pages 和 Services 中提供的 ADO.NET 的 IDbConnection 属性,并利用
OrmLite和Dapper等 Micro ORM 提供的便利扩展方法。例如,您可以使用 OrmLite 的类型化 API 查看插入到 AppHost 中的所有联系人:
<ul>
@foreach (var contact in Db.Select<Contact>())
{
<li>@contact.Name @contact.Email (@contact.Age)</li>
}
</ul>
而不是直接查询数据库,另一种选择是查询您可以使用 IOC 从 IOC 解析的服务或存储库Get<T>
,例如:
<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 请求对象,则需要手动注入或代替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 函数,该函数将其转换为 HTML 字符串,该字符串使用 jQuery 注入到#embedded-json UL HTML 元素中$.append()
。
使用 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 中,您不需要单独的控制器,因为您现有的服务也用作视图的控制器,其响应用作 ViewModel,在这种情况下,语法与 ASP.NET MVC 中的语法完全相同,即:
@model Contact
<h3>View Model</h3>
<ul>
<li>@Model.Name @Model.Email (@Model.Age)</li>
</ul>