2011-01-07 12 views
0

私は最初の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 
    %> 

しかし、私グラム第2の「セット」ノード上のSelectSingleNode(「ブロック」)にアクセスしようとすると、そのノードに「ブロック」ノードがないため、オブジェクトブロックまたはブロック付きエラーが発生します。

私は、私が見ている方法がすべて間違っていると感じています。私はそれを使用することができますので、ビューにこの単純なXMLデータを取得するより良い方法はありますか?

答えて

1

コントローラーがXMLを読み込むSetクラス(MVCのModelクラスになります)を作成することを検討してください。次に、このSetクラスは 'block'要素が存在しないことを処理できます。

データのシリアル化された表現に直接ビューをバインドすることは、一般的には悪い考えです。これはちょうど最初のアプリケーションですが、最初からMVCパターンの 'ルール'に従うと良いでしょう。そして、あなたはもっと道に沿って学び/理解します!

1

XML文書をビューに渡すより良い方法は、XML文書を表すクラスを作成し、文書をその型にシリアル化してから、そのクラスのインスタンスをビューに渡すことです。

ドキュメントをクラスにシリアル化する簡単な方法の1つは、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> 
関連する問題