在我的ASP MVC应用程序中,我根据XML文件中的数据填充视图中的内容。
我的问题是,我这样做是最好的方式吗?当然,必须有一种更有效,更轻松的方式去做我在这里做的事情。
以下是我的XML文件中的标记示例:
<?xml version="1.0" encoding="utf-8" ?>
<Content>
<!-- P1: Customer details -->
<ContentItem>
<key>Header_CancelImg</key>
<value>~/Content/mainpage/images/close.gif</value>
</ContentItem>
<ContentItem>
<key>Header_CancelText</key>
<value>Cancel this application</value>
</ContentItem>
所以,我正在反序列化这个XML文件的内容,如下所示:
using (MemoryStream ms = new MemoryStream(System.IO.File.ReadAllBytes(path))) {
XmlSerializer serializer = new XmlSerializer(typeof(Content));
pageContent = serializer.Deserialize(ms) as Content;
}
一切都好。现在,基于此,我可以根据这些内容填充视图的最佳方式是什么?让我告诉你我的意思,以及我现在如何做(非常可怕):
@model <project.Models.Content> // This content object contains Content object where the deserializer is present as shown above
@foreach (var contentItem in Model.Item2.contentItemList)
{
@if(contentItem.key == "Header_CancelImg")
{
<img src="@Url.Content(contentItem.value)">
continue;
}
@if(contentItem.key == "Header_CancelText")
{
<p>@contentItem.value</p>
continue;
}
} // and so on
我能做到这一点更简单吗? 感谢
答案 0 :(得分:2)
如果您为Content
类提供了默认属性,则可以通过引用键名来访问模型中的数据,而无需迭代所有不同的可能键。我已经展示了一个私有字典属性,它在第一次打击时被懒惰地初始化。
public class Content
{
private Dictionary<string, string> contentItems;
public string this[string key]
{
if (contentItems == null)
{
contentItems = contentItemList.ToDictionary(i => i.Key, i => i.Value);
}
if (contentItems.ContainsKey(key))
{
return contentItems[key];
}
return string.Empty;
}
//other properties
}
然后你的剃刀代码可能是这样的:
@model project.Models.Content
<img src="@Url.Content(Model["Header_CancelImg"])">
<p>@Model["Header_CancelText"]</p>