在 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>
我有一项服务可同时用于 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>