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

时间:2015-03-14 21:06:24

标签: servicestack servicestack-razor

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

现在我一直把它注入Request.Items数组。有更好的方法,还是这个足够好?

1 个答案:

答案 0 :(得分:4)

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

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

访问视图中的数据

由于Razor Pages提供对框架功能的完全访问权限,因此它可以通过几种不同的方式访问您网页中的数据,如info.cshtml所示:

直接访问Db

如果您在IOC中注册数据库工厂,您可以使用页面和服务中提供的ADO.NET的base.Db IDbConnection属性,并利用Micro ORM提供的便利扩展方法,如 OrmLiteDapper。 例如,您可以使用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>来执行此操作。

嵌入式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函数,该函数将其转换为使用jQuery $.append()注入#embedded-json UL HTML元素的HTML字符串。

通过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中,您不需要单独的Controller,因为您的现有服务还充当视图的Controller,其响应用作ViewModel,在这种情况下,语法与ASP.NET MVC中的语法完全相同,即:

@model Contact

<h3>View Model</h3>
<ul>
    <li>@Model.Name @Model.Email (@Model.Age)</li>
</ul>