将简单的XML数据从控制器传递到视图?

时间:2011-01-07 01:41:15

标签: asp.net-mvc vb.net

我正在编写我的第一个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数据放入视图中,以便我可以使用它?

2 个答案:

答案 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>