在 DTO 之外将参数传递给 HTML(视图)

Passing parameters to HTML (view) outside of DTO

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

现在我一直将它注入 Request.Items 数组。有没有更好的方法,或者这样就够了吗?

Request.Items 字典可用于在整个 ServiceStack 的请求和响应管道中传递附加数据。

但是您不需要传递视图所需的所有数据,因为您可以在视图本身内部检索所需的任何其他数据,例如电子邮件联系人示例 shows different ways of accessing data in Razor Views:

访问视图中的数据

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

所示

直接访问数据库

如果您在 IOC 中注册了一个数据库工厂,您可以使用页面和服务中可用的 ADO.NET 的 base.Db IDbConnection 属性,并利用由像微型 ORM OrmLite and 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 请求对象,则需要手动注入或代替 Get<T>,调用 ResolveService<T> 来执行此操作。

嵌入式JSON

通常使用 JavaScript 最终成为生成 HTML 比 C# 更容易和更灵活的替代方法。一种方法是将 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 字符串,然后注入 #embedded-json UL HTML 元素使用 jQuery 的 $.append().

通过Ajax

加载

使用JavaScript生成HTML的流行替代方法是通过Ajax加载JSON,作为ServiceStackreturns纯DTO序列化成JSON(并尊重 HTTP Accept: application/json)变得非常简单,只需通过其发布的 /route 调用您的服务并直接在 JavaScript:

中遍历结果集
$.getJSON("/contacts", addContacts);

function addContacts(contacts) {
    $("#ajax").append(contactsHtml(contacts));
}

通过 Ajax 生成 HTML 实际上与 Embedded 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>