首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将动态JSON发布到MVC4操作

将动态JSON发布到MVC4操作
EN

Stack Overflow用户
提问于 2013-08-27 04:50:45
回答 3查看 2K关注 0票数 3

使用webapi,可以使用JObjectdynamic作为参数类型将动态JSON发布到操作:

Passing Dynamic JSON Object to Web API - Newtonsoft Example

如果我在MVC4中的非api操作上尝试这一点,这似乎不起作用。我的动作签名是:

代码语言:javascript
复制
public async Task<ActionResult> Post(JObject requestObj)

当我使用dynamic时,我只得到一个看似非动态的对象。如果我尝试使用JObject,我会得到以下错误:

代码语言:javascript
复制
[MissingMethodException]: Cannot create an abstract class.

在MVC4中的非api操作上是否可以实现类似的操作?

EN

回答 3

Stack Overflow用户

发布于 2015-08-21 06:16:08

在之前的项目中,我们需要将动态JSON发布到Web Api控制器。我们最终所做的是在客户端使用JSON并对其进行Base64编码。然后我们可以简单地将Base64编码的JSON发布到我们的后端。然后,我们的后端解码Base64输入,并使用Newtonsoft JSON将其转换为动态对象(实际上,它被转换为强类型的类,回退是动态的)。我同意,这有点奇怪,但还是奏效了。

票数 3
EN

Stack Overflow用户

发布于 2015-08-21 10:39:04

我不确定它是否会有帮助,但我在上面的评论中提到,我最终使用了自定义模型绑定器来实现这一点。我找出了我认为是提示这个问题的原始代码,这就是我最终得到的:

代码语言:javascript
复制
    public async Task<ActionResult> Post(dynamic request)
    {
        return await ExecuteRequest(request, "application/json");
    }

和一个自定义模型绑定器,如下所示(它适用于名为"post“或"public”的操作,尽管您可以选择自己的约定-并在所有其他操作上后退到默认值)

代码语言:javascript
复制
public class MyModelBinder : DefaultModelBinder
{        
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var actionName = controllerContext.RouteData.Values["Action"];
        if (controllerContext.Controller.GetType() == typeof(MyController) && actionName != null && 
            (string.Compare(actionName.ToString(), "post", StringComparison.OrdinalIgnoreCase) == 0 ||
            string.Compare(actionName.ToString(), "public", StringComparison.OrdinalIgnoreCase) == 0))
        {
            string contentText;

            using (var stream = controllerContext.HttpContext.Request.InputStream)
            {
                stream.Seek(0, SeekOrigin.Begin);
                using (var reader = new StreamReader(stream))
                    contentText = reader.ReadToEnd();
            }

            if (string.IsNullOrEmpty(contentText)) return (null);

            return JObject.Parse(contentText);
        }

        return base.BindModel(controllerContext, bindingContext);
    }
}

然后在Application_Start的开头注册自定义模型绑定器:

代码语言:javascript
复制
System.Web.Mvc.ModelBinders.Binders.DefaultBinder = new MyModelBinder();
票数 3
EN

Stack Overflow用户

发布于 2015-08-21 04:02:10

这似乎是不可能的。请阅读MSDN文档https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.aspx

操作方法不能具有未绑定的泛型类型参数。无界泛型类型参数的参数列表为空。无界泛型类型也称为开放式泛型类型。有关无界泛型类型参数的信息,请参阅类型参数约束中的“无界类型参数”一节。

您应该从APIController派生,或者创建一个CustomModelBinder (我不确定这个)。

请看以下链接:

posting a JObject to an action

.NET MVC Action parameter of type object

Can abstract class be a parameter in a controller's action?

希望它能帮上忙!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18452801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档