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

本文关键字:文件 XML 显示 Html DropDownList | 更新日期: 2023-09-27 17:59:36

我有这个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>

我在html.dropdownlist 中显示列表名称单元

我使用这个代码:

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,"ID","Name");

这是在视图中:

<%=Html.DropDownList("xml",(SelectList) ViewData["xml"] )%>

但是导致了这个错误:

DataBinding:"System.Web.Mvc.SelectList"不包含名为"ID"的属性。

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

我会使用一个视图模型:

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);
}

最后,在我的强类型视图中,我会基于以下视图模型生成dropdownlist:

<%= 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, "Value", "Text");
        return View();