在Html.DropDownList中显示XML文件内容

问题描述

| 我有这个xml文件
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<CRM>
  <Unit ID=\"1\" Name=\"آذربایجان شرقی\">
    <city ID=\"1\">آذرشهر </city>
    <city ID=\"2\">اسکو  </city>
    <city ID=\"3\">اهر  </city>
    <city ID=\"12\">کلیبر </city>
    <city ID=\"13\">مراغه </city>
    <city ID=\"14\">مرند </city>
    <city ID=\"15\">ملکان </city>
    <city ID=\"16\">ملکان </city>
    <city ID=\"17\">میانه </city>
    <city ID=\"18\">ورزقان </city>
    <city ID=\"19\">هریس </city>
    <city ID=\"20\">هشترود</city>
  </Unit>

  <Unit  ID=\"2\"  Name=\"آذربایجان غربی\">
    <city ID=\"1\">ارومیه </city>
    <city ID=\"2\">اشنویه </city>
    <city ID=\"3\">بوکان </city>
    <city ID=\"4\">پیرانشهر </city>
    <city ID=\"5\">تکاب </city>
    <city ID=\"6\">چالدران </city>
  </Unit>

  <Unit ID=\"3\" Name=\"اردبیل\">
    <city ID=\"1\">اردبیل </city>
    <city ID=\"2\">بیله‌سوار </city>
  </Unit>

  <Unit ID=\"4\" Name=\"اصفهان\">
    <city ID=\"1\">آران و بیدگل</city>
    <city ID=\"2\">اردستان </city>
    <city ID=\"3\">اصفهان </city>
    <city ID=\"4\">برخوار و میمه</city>
    <city ID=\"5\">تیران و کرون</city>
    <city ID=\"6\">چادگان </city>
    <city ID=\"7\">خمینی‌شهر </city>
    <city ID=\"8\">خوانسار </city>
    <city ID=\"9\">سمیرم </city>
    <city ID=\"10\">شهرضا\"</city>
    <city ID=\"11\">سمیرم سفلی\"</city>
    <city ID=\"12\">فریدن\"</city>
  </Unit>
</CRM>
我在ѭ1中显示清单名称单位 我使用以下代码
List<SelectList> u = new List<SelectList>();

var locations = XDocument.Load(strXmlpath);
var query = from l in locations.Descendants(\"CRM\") select l;

foreach (var q in query)
{
  u.Add(new SelectList(new[] {
                               new {ID   = q.Attributes(\"ID\").FirstOrDefault(),Name = q.Attributes(\"Name\").FirstOrDefault()
                                   }
                             },\"ID\",\"Name\",1));
}

ViewData[\"xml\"] = new SelectList(u,\"Name\");
这是在视图中:
<%=Html.DropDownList(\"xml\",(SelectList) ViewData[\"xml\"] )%>
但是导致此错误:   数据绑定:\'System.Web.Mvc.SelectList \'不包含名称为\'ID \'的属性。     

解决方法

        我将使用视图模型:
public class UnitViewModel
{
    public string SelectedID { get; set; }
    public IEnumerable<SelectListItem> Units { get; set; }
}
解析XML文件后,我将在控制器操作中填充以下内容:
public ActionResult Index()
{
    // TODO: it would be better to externalize the parsing of the XML
    // file into a separate repository class to avoid cluttering your
    // controller actions with such code which is not what they should
    // be responsible for. But for the purpose of this answer it should 
    // be enough 

    var file = Path.Combine(Server.MapPath(\"~/app_data\"),\"crm.xml\");
    var model = new UnitViewModel
    {
        Units = 
            from unit in XDocument.Load(file).Document.Descendants(\"Unit\")
            select new SelectListItem
            {
                Value = unit.Attribute(\"ID\").Value,Text = unit.Attribute(\"Name\").Value
            }
    };
    return View(model);
}
最后在我的强类型视图中,我将基于此视图模型生成下拉列表:
<%= Html.DropDownListFor(
    x => x.SelectedID,new SelectList(Model.Units,\"Value\",\"Text\")
) %>
    ,        因此,我使用了该主题和其他一些主题来弄清我的国家/地区下拉列表所需的解决方案。我认为这可能会在将来对人们有所帮助。 这就像一个咒语可能不是最干净的解决方案,但是嘿
        var file = Path.Combine(Server.MapPath(\"~/Content/xml\"),\"countries.xml\"); 
        XmlDocument doc = new XmlDocument();

        doc.Load(file);
        XmlNodeList countryList = doc.GetElementsByTagName(\"Country\");

        List<SelectListItem> countries = new List<SelectListItem>(); 

        foreach (XmlNode country in countryList) 
        { 
            string name = country.ChildNodes[0].InnerText; 
            string code = country.ChildNodes[1].InnerText; 


            countries.Add(new SelectListItem 
            { 
                Text = name,Value = code 
            }); 
        }

        ViewBag.country = new SelectList(countries,\"Text\");

        return View();