استفاده از JSON.NET در ASP.NET MVC
نویسنده: وحید نصیری
تاریخ: ۱۳۹۳/۰۶/۱۵ ۲۳:۲۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
[HttpGet]
public ActionResult GetSimpleJsonData()
{
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { id = 1 }),
ContentType = "application/json",
ContentEncoding = Encoding.UTF8
};
} using System;
using System.Web.Mvc;
using Newtonsoft.Json;
namespace MvcJsonNetTests.Utils
{
public class JsonNetResult : JsonResult
{
public JsonNetResult()
{
Settings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Error };
}
public JsonSerializerSettings Settings { get; set; }
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
throw new ArgumentNullException("context");
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException("To allow GET requests, set JsonRequestBehavior to AllowGet.");
}
if (this.Data == null)
return;
var response = context.HttpContext.Response;
response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;
if (this.ContentEncoding != null)
response.ContentEncoding = this.ContentEncoding;
var serializer = JsonSerializer.Create(this.Settings);
using (var writer = new JsonTextWriter(response.Output))
{
serializer.Serialize(writer, Data);
writer.Flush();
}
}
}
} [HttpGet]
public ActionResult GetJsonData()
{
return new JsonNetResult
{
Data = new
{
Id = 1,
Name = "Test 1"
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Settings = { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }
};
} using System;
using System.Dynamic;
using System.Globalization;
using System.IO;
using System.Web.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace MvcJsonNetTests.Utils
{
public class JsonNetValueProviderFactory : ValueProviderFactory
{
public override IValueProvider GetValueProvider(ControllerContext controllerContext)
{
if (controllerContext == null)
throw new ArgumentNullException("controllerContext");
if (controllerContext.HttpContext == null ||
controllerContext.HttpContext.Request == null ||
controllerContext.HttpContext.Request.ContentType == null)
{
return null;
}
if (!controllerContext.HttpContext.Request.ContentType.StartsWith(
"application/json", StringComparison.OrdinalIgnoreCase))
{
return null;
}
using (var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream))
{
var bodyText = reader.ReadToEnd();
return string.IsNullOrEmpty(bodyText)
? null
: new DictionaryValueProvider<object>(
JsonConvert.DeserializeObject<ExpandoObject>(bodyText, new JsonSerializerSettings
{
Converters = { new ExpandoObjectConverter() }
}),
CultureInfo.CurrentCulture);
}
}
}
} [HttpPost] public ActionResult TestValueProvider(string data1, dynamic data2)
using System.Linq;
using System.Web.Mvc;
using System.Web.Routing;
using MvcJsonNetTests.Utils;
namespace MvcJsonNetTests
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
ValueProviderFactories.Factories.Remove(
ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault());
ValueProviderFactories.Factories.Add(new JsonNetValueProviderFactory());
}
}
} public class MyClass
{
public int Id { get; set; }
public string Name { get; set; }
}
[HttpPost]
public ActionResult TestValueProvider(string data1, MyClass data2)
{
var id = data2.Id;
var name = data2.Name;
return new JsonNetResult
{
Data = new { result = data1 },
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Settings = { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }
};
} public static void RegisterFactory()
{
var defaultJsonFactory = ValueProviderFactories.Factories
.OfType<JsonValueProviderFactory>().FirstOrDefault();
var index = ValueProviderFactories.Factories.IndexOf(defaultJsonFactory);
ValueProviderFactories.Factories.Remove(defaultJsonFactory);
ValueProviderFactories.Factories.Insert(index, new JsonNetValueProviderFactory());
} public enum MyEnum
{
One=1,
Two=2
}
[HttpPost]
public ActionResult TestValueProvider(string data1,MyEnum id,string name)
{ $.ajax({
//....
data: JSON.stringify(
{
data1: "Test1",
data2: { Id: 1, Name: "dynamic test" },
data3: 'Two' // مقدار دهی عضو ایینام
}),