如何在MVC中处理ViewData类型转换

Won*_*ing 0 c# asp.net asp.net-mvc

我是MVC的新手,面临一个问题.我有一个xml文件,我正在使用Linq检索其值到xml并将其分配给ViewData.Controller.cs

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

                  };
                   ViewData["Persons"]=res;
Run Code Online (Sandbox Code Playgroud)

在视图中我正在尝试

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


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


                 <% } %>  
Run Code Online (Sandbox Code Playgroud)

但foreach(ViewData ["Persons"]中的var项目给出类型转换错误..应该是csting的确切类型,以便我可以以item.Fname格式检索值.

谢谢.

Luk*_*Led 8

ViewData虽然可能,但使用不是从控制器传递信息到视图的最优雅方式.使用特定的视图模型可以使代码更简单,更清晰,并解决了转换问题.

首先尝试定义模型:

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


public class ViewModel
{
    public List<ViewModelElement> Elements { get; set; };
}
Run Code Online (Sandbox Code Playgroud)

然后使用您的模型:

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);
}
Run Code Online (Sandbox Code Playgroud)

然后在视图中使用您的模型:

<% foreach (var item in model.Elements) { %>  
   <li> <%= item.Fname %> </li>  
<% } %> 
Run Code Online (Sandbox Code Playgroud)

视图必须继承System.Web.Mvc.ViewPage<ViewModel>.