【发布时间】:2013-12-04 01:30:52
【问题描述】:
我之前有一个表格,其中输入了 2 个人的关系标题和名字、姓氏。输入信息并单击提交后,会生成一个 xml,如下所示:
<?xml version="1.0" encoding="utf-16"?>
<Data>
<RelationData>
<Relation Title="Friends">
<Persons>
<Person FirstName="Tom" LastName="B" />
<Person FirstName="Jerry" LastName="C" />
</Persons>
</Relation>
</RelationData>
</Data>
模型 - FormModel.cs
public class Relation
{
public string Title { get; set; }
public string Person1FirstName { get; set; }
public string Person1LastName { get; set; }
public string Person2FirstName { get; set; }
public string Person2LastName { get; set; }
}
XmlModel.cs
public class XmlModel
{
[XmlRoot("Data")]
public class Data
{
[XmlElement("RelationData")]
public RelationData RelationData { get; set; }
}
[SerializableAttribute()]
public class RelationData
{
[XmlElement("Relation")]
public Relation Relation { get; set; }
}
[SerializableAttribute()]
public class Relation
{
[XmlElementAttribute()]
public Persons Persons { get; set; }
[XmlAttributeAttribute()]
public string Title { get; set; }
}
[SerializableAttribute()]
public class Persons
{
[XmlElementAttribute("Person")]
public Person[] Person { get; set; }
}
[SerializableAttribute()]
public class Person
{
[XmlAttributeAttribute()]
public string FirstName { get; set; }
[XmlAttributeAttribute()]
public string LastName { get; set; }
}
}
View.cshtml 被强类型化为 FormModel 中的 Relation 类。它包含文本框和调用控制器中的 CreateData 操作的提交按钮。
<div class="form-horizontal">
@Html.ValidationSummary(true)
<div class="form-group">
<input id="CreateData" type="submit" class="btn btn-primary" value="Create Data File" />
</div>
</div>
Controller.cs - 读取传入的数据并创建使用帮助类 XmlResult 序列化的 XmlModel 对象。
[HttpPost]
public ActionResult CreateData(Relation rData)
{
var xmlModelData = new XmlModel();
// Create elements in XmlModel object using values in rData
...
return new XmlResult<XmlModel>()
{
Data = xmlModelData
};
}
助手类
public class XmlResult<T> : ActionResult
{
public T Data { private get; set; }
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.Clear();
context.HttpContext.Response.ContentType = "text/xml";
context.HttpContext.Response.ContentEncoding = Encoding.UTF8;
var filename = DateTime.Now.ToString("mmddyyyyhhss") + ".xml";
context.HttpContext.Response.AddHeader("content-disposition", "attachment; filename=" + filename);
using(var writer = new StringWriter())
{
XmlSerializer xs = new XmlSerializer(typeof(T));
xs.Serialize(writer, Data);
context.HttpContext.Response.Write(writer);
}
}
}
所以这会在浏览器上提供一个对话框,提供保存或打开 xml 的选项。
现在我们希望在表单上添加更多输入,并且基于这些输入,需要在同一个 xml 文件中生成一些更复杂的 xml 数据。
xml格式比较复杂,但是会是之前xml中的新数据,比如:
<?xml version="1.0" encoding="utf-16"?>
<Data>
<RelationData>
<Relation Title="Friends">
<Persons>
<Person FirstName="Tom" LastName="B" />
<Person FirstName="Jerry" LastName="C" />
</Persons>
</Relation>
<Relation Title="Friends">
<Persons>
<Person FirstName="Hello" LastName="AD" />
<Person FirstName="World" LastName="BC" />
</Persons>
</Relation>
...
</RelationData>
<ComplexData>
...
</ComplexData>
</Data>
如您所见,表单可以提供多个 Relation 项以及一些 ComplexData。我不想为这个 ComplexData 结构创建类,所以我可能想要一些方法来直接编写 xml 而不是序列化对象。现在将视图绑定到关系模型也没有意义。
那么我该怎么做,以便我仍然能够在浏览器中生成 xml 文件?在当前的解决方案中,它正在做一个服务器发布,但我愿意将其更改为完全在客户端工作。不确定这是否可以使用 jquery/javascript 来完成?
【问题讨论】:
标签: c# javascript jquery xml asp.net-mvc