The following class creates a new kind of ActionResult for spewing out the serialized string of an inputted data contract instance.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Runtime.Serialization;
namespace TestActionMethodSelectorAttribute.ActionResult
{
public class DataContractSerializedResult : System.Web.Mvc.ActionResult
{
private object data;
public DataContractSerializedResult(object data)
{
this.data = data;
}
public override void ExecuteResult(ControllerContext context)
{
var response = context.HttpContext.Response;
response.ContentType = "text/xml";
DataContractSerializer serializer = new DataContractSerializer(data.GetType());
serializer.WriteObject(response.OutputStream, data);
}
}
}
You will need to add a reference to the System.Runtime.Serialization assembly and namespace. We use DataContractSerializer to serialize the object to a string value. The stream in use is the context.HttpContext.Response.OutputStream, where context is the ControllerContext (current).
It is required to set the ContentType to "text/xml" to output xml.
Usage, adding a test method to homecontroller (ignore Hungarian notation, this is for demonstration purposes..) :
public DataContractSerializedResult About2()
{
return new DataContractSerializedResult(
new AgeNameDataContract
{
Age = 93,
Name = "Gamla Olga"
});
}
Then we get the xml outputted of the data contract passed in:
The morale of the story, to create a new kind of ActionResult:
- inherit from ActionResult
- implement abstract method ExecuteResult
An almost similar method could try deserializing a string value into an object. Make sure that the object passed into this method is a datacontract. We could probably include some fail-safe code to check that the class in use got a custom attribute set of data contract or similar, I will leave that refinment to you, TypeDescriptor is a good start here..
ReplyDelete