0

我有一个用于 JSON 和 HTML 的服务。对于 HTML 渲染,我需要传递一些不适合包含在“通用 DTO”中的额外参数。例如,要使用哪个 CSS 文件或其他东西。

现在我一直将它注入到Request.Items数组中。有没有更好的方法,或者这是否足够好?

4

1 回答 1

4

Request.Items您可以使用 Dictionary 来在整个 ServiceStack 的请求和响应管道中传递额外的数据。

但是您不需要传递视图所需的所有数据,因为您可以在视图本身中检索您需要的任何其他数据,例如电子邮件联系人示例显示了在 Razor 视图中访问数据的不同方式

访问视图中的数据

由于 Razor 页面提供对框架功能的完全访问权限,因此它支持几种不同的方式来访问页面内的数据,如info.cshtml所示:

直接访问数据库

如果您在 IOC 中注册数据库工厂,则可以使用base.DbPages 和 Services 中提供的 ADO.NET 的 IDbConnection 属性,并利用 OrmLiteDapper等 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>来执行它。

嵌入式 JSON

通常使用 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()

通过 Ajax 加载

使用 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>
于 2015-03-14T23:50:15.870 回答