【问题标题】:stuck binding xml to Model Class将 xml 绑定到模型类
【发布时间】:2010-02-06 20:57:08
【问题描述】:

我正在尝试使用 xml 作为小型 CMS 的数据库,例如画廊或员工档案 等等

然而,我全神贯注于如何将我的 xml 文档绑定到模型类 这样我就可以将该类用于强类型视图:

这是我的模型类:

[XmlRoot("employee")]
public class EmployeesModel
{
    [Required]
    [DisplayName("Name: ")]
    [XmlElement("employeeName")]
    public string employeeName { get; set; }

    [Required]
    [DisplayName("Position: ")]
    [XmlElement("employeePosition")]
    public string employeePosition { get; set; }

    [Required]
    [DisplayName("Description")]
    [XmlElement("employeeDescription")]
    public string employeeDescription { get; set; }

    [Required]
    [DisplayName("Photo: ")]
    [XmlElement("employeePhoto")]
    public string employeePhoto { get; set; }

    [Required]
    [DisplayName("ID: ")]
    [XmlElement("employeeID")]
    public int employeeID { get; set; }
}

这是我的代码:

XDocument xmlDoc = XDocument.Load(Server.MapPath("~/App_Data/employees.xml"));

        var model = (from xml in xmlDoc.Descendants("employee")
                                             select xml) as IEnumerable<EmployeesModel>;

        return View(model);

XML

<?xml version="1.0" encoding="utf-8" ?>
<employees>
<employee>
    <employeeName>David parker</employeeName>
     <employeePosition>Senior Web Developer</employeePosition>
     <employeeDescription>This is a test description<br>feele free to add something here.</employeeDescription>
     <employeePhoto>mypic.jpg</employeePhoto>
    <employeeID>1</employeeID></employee></employees>

xml 方面的工作,但模型总是空的,但是我在尝试绑定时没有运行时错误,我知道我应该在这里做更多的事情,但我需要一些帮助。

为了清楚起见,我使用的是 asp.net mvc 2 rc 2

谢谢

【问题讨论】:

    标签: c# asp.net asp.net-mvc xml asp.net-3.5


    【解决方案1】:

    您需要将 XML 反序列化为对象。您不能简单地将 XML 转换为对象。当你说as IEnumerable&lt;EmployeesModel&gt; 时,你会得到一个null,因为类型不兼容。您的代码可能如下所示:

    var serializer = new XmlSerializer(typeof(EmployeesModel));
    var model = 
        from xml in xmlDoc.Descendants("employee")
        select serializer.Deserialize(xml.CreateReader()) as EmployeesModel;
    

    您可以考虑的另一个选择是将XElements 投影到EmployeesModel对象中,如下所示:

    var model =
        from xml in xmlDoc.Descendants("employee")
        select new EmployeesModel {
            employeeName = (string)xml.Element("employeeName"),
            employeePosition = (string)xml.Element("employeePosition"),
            employeeDescription = (string)xml.Element("employeeDescription"),
            employeePhoto = (string)xml.Element("employeePhoto"),
            employeeID = (int)xml.Element("employeeID"), };
    

    如您所见,这可能会变得乏味。但是,这可能是合适的。如果您的 XML 文件表示所有员工数据,但您的视图仅显示数据的子集或不同结构的数据,您可能不希望您的视图模型成为数据存储内容的直接副本。

    【讨论】:

    • 就像在 select new { Model.name = xml.Element("name").value } 中一样,如果是这样,我就将模型声明为新的 EmployeeModel 吧???
    • 感谢您的帮助,但我得到了错误: 不是预期的。在线选择 serializer.Deserialize(xml.CreateReader()) 作为EmployeesModel;如果这有帮助,我已经更新了我的帖子以包含 XML!!!!想我是否必须先设置某种循环,然后将每个项目反序列化为新的 EmployeeModel ????谢谢
    • XmlSerializer 类假定将元素名称直接映射到属性。你可以用属性装饰你的EmployeesModel 类来描述如何进行映射(参见msdn.microsoft.com/en-us/library/83y7df3e(VS.71).aspx)。或者你可以在你的 LINQ 中使用投影而不是 XmlSerializer(我很快就会添加一个示例)。
    • 你的权利它现在可以立即使用,我的错误是我描述中的
      。因为它是一个 xml 标签,所以我只需要在输入之前对我的描述进行 html 编码,一切都像一个魅力。
    【解决方案2】:

    如果你想将 xml 绑定到模型类,你可以在 codeplex 上使用 templay。 此外,您可以对模型类及其子类进行一些处理。

    https://templay.codeplex.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多