将 @Html.Raw 替换为 Knockout
Replace @Html.Raw with Knockout
我的观点如下:
<div class="attributes">
@Html.Raw(item.AttributeInfo)
</div>
item.Attribute 信息是 C# 视图模型的一部分。现在我用 KO 视图模型替换它,并且只有 AttributeInfo。
那么,如何使用 KO 替换视图的指定部分?
像下面这样的东西应该可以工作...
<div class="attributes" data-bind="html: attributeInfo"></div>
<!-- assume KO is already included -->
<script>
function ViewModel(attributeInfo){
this.attributeInfo = ko.observable(attributeInfo || '');
};
ko.applyBindings(new ViewModel('@Html.Raw(item.AttributeInfo)'));
</script>
现在 HTML 仍然需要以某种方式输出到页面(因为 KO 在客户端运行,而模型就目前而言是在服务器端)。我也没有对 item.AttributeInfo
包含会使 JS 变形的内容(例如值中的 '
)执行任何安全防护。
但是,您可以稍微清理一下(以及使用 KO 映射)并使其更干净一些:
@{
IHtmlString modelJs = new HtmlString(
JsonConvert.SerializeObject(
item,
Formatting.None,
new CamelCasePropertyNamesContractResolver()
)
);
}
<div class="attribute" data-bind="html:attributeInfo"></div>
<script>
var viewModel = ko.mapping.fromJS(@modelJs);
ko.applyBindings(viewModel);
</script>
我的观点如下:
<div class="attributes">
@Html.Raw(item.AttributeInfo)
</div>
item.Attribute 信息是 C# 视图模型的一部分。现在我用 KO 视图模型替换它,并且只有 AttributeInfo。 那么,如何使用 KO 替换视图的指定部分?
像下面这样的东西应该可以工作...
<div class="attributes" data-bind="html: attributeInfo"></div>
<!-- assume KO is already included -->
<script>
function ViewModel(attributeInfo){
this.attributeInfo = ko.observable(attributeInfo || '');
};
ko.applyBindings(new ViewModel('@Html.Raw(item.AttributeInfo)'));
</script>
现在 HTML 仍然需要以某种方式输出到页面(因为 KO 在客户端运行,而模型就目前而言是在服务器端)。我也没有对 item.AttributeInfo
包含会使 JS 变形的内容(例如值中的 '
)执行任何安全防护。
但是,您可以稍微清理一下(以及使用 KO 映射)并使其更干净一些:
@{
IHtmlString modelJs = new HtmlString(
JsonConvert.SerializeObject(
item,
Formatting.None,
new CamelCasePropertyNamesContractResolver()
)
);
}
<div class="attribute" data-bind="html:attributeInfo"></div>
<script>
var viewModel = ko.mapping.fromJS(@modelJs);
ko.applyBindings(viewModel);
</script>