我一直在使用 Razor 引擎
几天了,我喜欢它
很多。我注意到了一个大问题
从一开始,所有字符串都是 HTML
编码。对于我们的使用,这变成
当我们
处理 JSON 字符串。例如,
给定一个简单的 JSON 字符串 ["1", "2",
"3", "4"]
这个的实际 HTML 编码输出
变成了 ["1", "2",
"3", "4"]
引号已被转义,即
不是所需的输出。如果我们需要
发回 HTML 或 XML,我们会
然后必须单独逃脱
那些。总的来说,我觉得这很
烦人,因为我们必须把它包起来
在 HtmlString 内部,如图所示
这个 StackOverflow 帖子。
在我们的场景中,我们正在生成
来自 C# 的 JSON/XML,所以大多数时候,
我们的序列化数据在
视图模型。这将导致我们
像@(新
HtmlString(View.Foo)) @(新
HtmlString(View.Bar))
如您所见,这可以变得相当
麻烦。所以我决定
剽窃 MVC 的一部分以创建一个
原始视图。最后,使用将
是,@RawView.Foo @RawView.Bar
我也继续允许使用
索引运算符以及以防万一
需要用一个循环遍历它
键列表。 // 假设我们有 Foo,
我们的 ViewModel 中的 Bar 和 Baz @{
列表键 = 新列表 { "Foo", "Bar", "Baz" };
foreach(键中的var键){
@RawView[键]
} }
要实现这一点,我需要
复制 DynamicViewDataDictionary。
自然是我给它取名
DynamicRawViewDataDictionary,公共
类 DynamicRawViewDataDictionary :
动态对象
{
私有只读 Func viewThunk;
公共 DynamicRawViewDataDictionary(Func
viewTunk)
{
this.viewThunk = viewThunk;
}
private ViewDataDictionary ViewData
{
get
{
ViewDataDictionary viewData = this.viewThunk();
return viewData;
}
}
public object this[string key]
{
set { setData(key, value); }
get { return getData(key); }
}
public override IEnumerable<string>
GetDynamicMemberNames()
{
返回 ViewData.Keys;
}
public override bool TryGetMember(GetMemberBinder binder,
输出对象结果)
{
结果 = getData(binder.Name);
返回真;
}
public override bool TrySetMember(SetMemberBinder binder,
对象值)
{
setData(binder.Name, value);
返回真;
}
private object getData(string key)
{
object value = ViewData[key];
if (value is string)
{
return new HtmlString(value.ToString());
}
return value;
}
private void setData(string key, object value)
{
ViewData[key] = value;
}
}
重复的原因是
因为 DynamicViewDataDictionary
是一个内部密封类。有
我没办法解决这个问题
复制以外的限制和
粘贴。我做出的明显改变
这个类是getData 方法。一世
检查对象是否是
字符串,如果是,我用一个
htmlString().
现在我需要在一个
WebViewPage,因为所有视图,我都有
有一个定制的版本
WebViewPage 也是如此。好东西
MS 没有把这个类变成内部的
密封,所以我可以很容易地继承
它。我需要制作一个通用的和一个
非通用版本,我只是扑通一声
这两个都在一个文件中。
公共抽象类
自定义WebViewPage:
网页浏览页面
{
私有 DynamicRawViewDataDictionary _rawData;
公共动态 RawView
{
得到
{
如果(_rawData == null)
{
_rawData = new DynamicRawViewDataDictionary(() =>
查看数据);
}
返回_rawData;
}
}
}
public abstract class CustomWebViewPage : WebViewPage
{
private DynamicRawViewDataDictionary _rawData;
public dynamic RawView
{
get
{
if (_rawData == null)
{
_rawData = new DynamicRawViewDataDictionary(() =>
查看数据);
}
返回_rawData;
}
}
}
为了真正做最后的润色
这项工作,在 cshtml 的顶部
文件,你应该有类似的东西,
@继承
命名空间.To.CustomWebViewPage
//或@inherits
命名空间.To.CustomWebViewPage
现在 cshtml 文件继承自
新的 CustomWebViewPage,它应该
可以访问 RawView,这将
用 HtmlString 包装所有字符串。
一旦你有了这个,你就会
仍然需要确保所有
您的新视图继承自
自定义WebViewPage。我强烈推荐
在您的
MVC 项目生成视图。这
将有助于自动化很多
平凡的任务。