asp.net-mvc - DataContractJsonSerializer ReadObject 异常

标签 asp.net-mvc json

我遵循 ASP.NET MVC How to pass JSON object from View to Controller as Parameter 已接受的答案。就像原来的问题一样,我有一个简单的 POCO。

在 DataContractJsonSerializer.ReadObject 方法之前,一切都对我来说工作正常。我收到以下异常:

Expecting element 'root' from namespace ''.. Encountered 'None' with name '', namespace ''.

 Public Overrides Sub OnActionExecuting(ByVal filterContext As ActionExecutingContext)
    If filterContext.HttpContext.Request.ContentType.Contains("application/json") Then
        Dim s As System.IO.Stream = filterContext.HttpContext.Request.InputStream

        Dim o = New DataContractJsonSerializer(RootType).ReadObject(s)

        filterContext.ActionParameters(Param) = o
    Else
        Dim xmlRoot = XElement.Load(New StreamReader(filterContext.HttpContext.Request.InputStream, filterContext.HttpContext.Request.ContentEncoding))
        Dim o As Object = New XmlSerializer(RootType).Deserialize(xmlRoot.CreateReader)
        filterContext.ActionParameters(Param) = o
    End If
End Sub

有什么想法吗?

最佳答案

您可能必须确保在 poco 上应用 [DataContract][DataMember] 属性。

作为一个单独的选项,您可能需要考虑我为 mvc ControllerContext 编写的扩展方法:

using System.Web;
using System.Web.Mvc;
using System.Web.Script.Serialization;

public static class MvcExtensions
{
    public static T DeserializeJson<T>(this ControllerContext context)
    {
        var serializer = new JavaScriptSerializer();
        var form = context.RequestContext.HttpContext.Request.Form.ToString();
        return serializer.Deserialize<T>(HttpUtility.UrlDecode(form));
    }
}

它可以让您使用 JavaScriptSerializer 轻松反序列化 json,如下所示:

var myInstance = controllerContext.DeserializeJson<MyClass>();

或者,更简单的是,您可以创建一个通用模型绑定(bind)器:

public class JsonBinder<T> : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        return controllerContext.DeserializeJson<T>();
    }
}

然后通过将此属性应用于 poco 类来强类型化您的 mvc 操作方法:

[ModelBinder(typeof(JsonBinder<MyClass>))]

关于asp.net-mvc - DataContractJsonSerializer ReadObject 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2587160/

相关文章:

c# - 如何在 ASP.NET MVC 中拥有一个文件扩展名会被请求过滤阻止的路由

asp.net-mvc - 如何将现有的 asp.net mvc 3 Web 应用程序转换为 azure

c# - 自定义 Razor Html 属性

javascript - 如何使用 RSS2JSON 显示和格式化日期?

asp.net-mvc - Visual Studio 找不到 Entity Framework

c# - 使用 EPPlus 创建后下载 Excel 文件

json - Node.js Restify - 简单服务

arrays - 如何从 JSON 数组中提取元素并将其放入另一个数组中

javascript - 如何使用本地 JSON 数据加载 TreePanel?

ruby-on-rails - 在 Rails 4 中格式化我的 JSON 输出