使用webapi,可以使用JObject或dynamic作为参数类型将动态JSON发布到操作:
Passing Dynamic JSON Object to Web API - Newtonsoft Example
如果我在MVC4中的非api操作上尝试这一点,这似乎不起作用。我的动作签名是:
public async Task<ActionResult> Post(JObject requestObj)当我使用dynamic时,我只得到一个看似非动态的对象。如果我尝试使用JObject,我会得到以下错误:
[MissingMethodException]: Cannot create an abstract class.在MVC4中的非api操作上是否可以实现类似的操作?
发布于 2015-08-21 06:16:08
在之前的项目中,我们需要将动态JSON发布到Web Api控制器。我们最终所做的是在客户端使用JSON并对其进行Base64编码。然后我们可以简单地将Base64编码的JSON发布到我们的后端。然后,我们的后端解码Base64输入,并使用Newtonsoft JSON将其转换为动态对象(实际上,它被转换为强类型的类,回退是动态的)。我同意,这有点奇怪,但还是奏效了。
发布于 2015-08-21 10:39:04
我不确定它是否会有帮助,但我在上面的评论中提到,我最终使用了自定义模型绑定器来实现这一点。我找出了我认为是提示这个问题的原始代码,这就是我最终得到的:
public async Task<ActionResult> Post(dynamic request)
{
return await ExecuteRequest(request, "application/json");
}和一个自定义模型绑定器,如下所示(它适用于名为"post“或"public”的操作,尽管您可以选择自己的约定-并在所有其他操作上后退到默认值)
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的开头注册自定义模型绑定器:
System.Web.Mvc.ModelBinders.Binders.DefaultBinder = new MyModelBinder();发布于 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?
希望它能帮上忙!
https://stackoverflow.com/questions/18452801
复制相似问题