我正在编写我的第一个MVC应用程序,并且在如何最好地将数据从我的控制器传递到我的视图方面苦苦挣扎。我有一个非常简单的XML文档,结构如下。 (是的,这是Magic:The Gathering数据)
<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>
(请注意,某些节点如“Block”和“Cards”是可选的。)
在我第一次尝试时,我正在尝试这个:
' 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
%>
但是当我尝试访问第二个“set”节点上的SelectSingleNode(“block”)时,我得到一个Object Block或With Block错误,因为该节点没有“block”节点。
我也有一种感觉,我接近视图的方式都是错的。有没有更好的方法将这个简单的XML数据放入视图中,以便我可以使用它?
答案 0 :(得分:1)
您应该考虑在Controller中加载XML,从而创建一个Set类(这将是MVC中的Model类)。然后,这个Set类可以处理'block'元素的缺失。
将您的视图直接绑定到数据的序列化表示通常是个坏主意。虽然这只是第一个应用程序,但从一开始就遵循MVC模式的“规则”会很好,并且您将在此过程中学习/了解更多!
答案 1 :(得分:1)
将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>