将简单的XML数据从控制器传递到视图?
问题描述:
我正在写我的第一个MVC应用程序,并在如何最好地将数据从我的控制器传递到我的视图方面苦苦挣扎。我有一个非常简单的XML文档。 (是的,这是万智牌数据)将简单的XML数据从控制器传递到视图?
<setlist>
<set>
<name>Alara Reborn</name>
<block>Shards of Alara</block>
<cards>145</cards>
<code>ARB</code>
</set>
<set>
<name>Archenemy</name>
<code>ARC</code>
</set>
</setlist>
(注意,有些像“阻止”和节点的“卡”是可选的)
在我的第一次尝试,我想这:
' Load the set info
Dim doc As New System.Xml.XmlDocument
doc = LoadXML("setinfo.xml")
Dim listSet = doc.GetElementsByTagName("set")
ViewData("sets") = listSet
在我看来
然后,我试图访问的XmlNodeList是这样的:
<%
If ViewData("sets").count > 0 Then
For i = 1 To (ViewData("sets").count - 1)
%>
<tr>
<td><%= ViewData("sets")(i).SelectSingleNode("code").InnerText%></td>
<td><%= ViewData("sets")(i).SelectSingleNode("name").InnerText%></td>
<td><%= ViewData("sets")(i).SelectSingleNode("block").InnerText%></td>
</tr>
<%
Next
End If
%>
但时I g在尝试访问第二个“set”节点上的SelectSingleNode(“block”)时发生Object block或With Block错误,因为该节点没有“block”节点。
我也有一种感觉,我接近视图的方式都是错误的。有没有更好的方法将这个简单的XML数据放入视图中,以便我可以使用它?
答
您应该考虑创建一个控制器将XML加载到的Set类(这将是MVC中的Model类)。然后这个Set类可以处理没有'block'元素。
将视图直接绑定到数据的序列化表示通常是一个糟糕的主意。尽管这只是第一个应用程序,但从一开始就遵循MVC模式的“规则”会很好,并且您会一路学习/理解更多内容!
答
将XML文档传递给视图的更好方法是创建一个代表xml文档的类,将文档序列化为类型,然后将该类的实例传递给视图。
将文档序列化为类的一种简单方法是使用XmlSerializer。
域类:
<System.Xml.Serialization.XmlRoot("setlist")> _
Public Class SetList
Inherits List(Of SetItem)
End Class
<System.Xml.Serialization.XmlType("set")> _
Public Class SetItem
<System.Xml.Serialization.XmlElement("name")> _
Public Name As String
<System.Xml.Serialization.XmlElement("block")> _
Public Block As String
<System.Xml.Serialization.XmlElement("cards")> _
Public Cards As String
<System.Xml.Serialization.XmlElement("code")> _
Public Code As String
End Class
控制器:
Public Class SetController
Inherits System.Web.Mvc.Controller
Function Index() As ActionResult
Using reader As System.IO.FileStream = System.IO.File.OpenRead("SetInfo.xml")
Dim xmlSerializer As New System.Xml.Serialization.XmlSerializer(GetType(SetList))
Dim setList As SetList = xmlSerializer.Deserialize(reader)
Return View(setList)
End Using
End Function
End Class
视图(注意,这是一个strongly typed view):
<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage(Of VB.SetList)" %>
<html>
<head>
<title>Test</title>
</head>
<body>
<div>
<table>
<tr>
<th>Code</th>
<th>Name</th>
<th>Block</th>
</tr>
<%For Each setItem In Model%>
<tr>
<td><%=setItem.Code%></td>
<td><%=setItem.Name%></td>
<td><%=setItem.Block%></td>
</tr>
<%Next%>
</table>
</div>
</body>
</html>