将简单的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>