2010-04-21 18 views
0

我是MVC的新手,面臨一個問題。 我有一個xml文件,我正在檢索它的值使用Linq到XML並分配給ViewData。 Controller.cs如何在MVC中處理ViewData類型轉換

  var res=from x in doc.Descendants("person") 
        select new 
        { 
        Fname=x.Element("fname").Value, 
        Lname=x.Element("lname").Value 

        }; 
        ViewData["Persons"]=res; 

在查看我試圖在計算機[ 「人」]

  <% foreach (var item in ViewData["Persons"]) 
       { %> 


        <li> <%= item.Fname %> </li> 


       <% } %> 

但的foreach(VAR項目給予型鑄造error..what應該是確切類型csting所以我可以在格式item.Fname。

感謝。

回答

7

使用ViewData retrive值,雖然可能是不通過信息最優雅的方式從控制器查看。使用特定的視圖模型可以使代碼更簡單,更清晰,並解決投射問題。

嘗試定義模型第一:

public class ViewModelElement 
{ 
    public string Fname { get; set; } 
    public string LName { get; set; } 
} 


public class ViewModel 
{ 
    public List<ViewModelElement> Elements { get; set; }; 
} 

然後用你的模型在行動:

public ActionResult ActionName() 
{ 
    //get doc somehow 
    var model = new ViewModel(); 

    //When querying by linq to xml, you can create ViewModelElement instead of anonymous class 
    model.Elements = (from x in doc.Descendants("person") 
     select new ViewModelElement 
     { 
     Fname=x.Element("fname").Value, 
     Lname=x.Element("lname").Value 
     }).ToList(); 

    return View(model); 
} 

然後用你的模型視圖:

<% foreach (var item in model.Elements) { %> 
    <li> <%= item.Fname %> </li> 
<% } %> 

觀必須從System.Web.Mvc.ViewPage<ViewModel>繼承。

+0

選擇新的ViewModelElement給鑄造問題..它說不能從類型Generic.Ienumerable轉換爲Generic.List – Wondering 2010-04-21 19:28:38

+0

@Wondering:你可以添加.ToList()時設置'元素'。這是你的問題?我糾正了我的解決方案 – LukLed 2010-04-21 20:33:45

+0

thanks.it工作。 – Wondering 2010-04-22 10:38:52

0

ViewData集合中非強類型視圖的默認類型是object。

您的視圖拋出一個異常,因爲它不能自動將對象轉換回LINQ查詢返回的IEnumerable。

你的循環改成這樣,它應該很好地工作:

<% foreach (var item in (IEnumerable)ViewData["Persons"]) 
       { %> 


        <li> <%= item.Fname %> </li> 


       <% } %> 

到目前爲止,最好的建議是強類型的意見,這樣你可以做什麼LukLed建議

+0

我無法檢索item.Fname ..實際上Fname不是來自intellisense本身。 – Wondering 2010-04-21 19:31:12

0

問題與您現有的代碼是你用Linq查詢將你的數據投影到一個匿名類型中,所以沒有命名類型可以投射到。

假設你有一個名爲類型(人)投給(你仍然想使用的ViewData),你的解決辦法是:

<% foreach (var item in (IEnumerable<Person>)ViewData["Persons"]) 

但是從一個強類型的視圖模型對象繼承,你的頁面更好的解決方案。

相關問題