向MVC4操作发布动态JSON
本文关键字:动态 JSON 布动态 MVC4 操作 | 更新日期: 2023-09-27 18:29:09
使用webapi,可以使用JObject
或dynamic
作为参数类型将动态JSON POST到操作:
将动态JSON对象传递到Web API-Newtonsoft示例
如果我在MVC4中的一个非api操作上尝试这个操作,这似乎不起作用。我的行动签名是:
public async Task<ActionResult> Post(JObject requestObj)
当我使用动态时,我只得到一个看似非动态的对象。如果我尝试JObject,我会得到以下错误:
[MissingMethodException]: Cannot create an abstract class.
MVC4中的非api操作是否可能出现类似的情况?
在以前的项目中,我们需要将动态JSON发布到WebApi控制器。我们最终做的是在客户端获取JSON,并用Base64对其进行编码。然后我们可以简单地将Base64编码的JSON发布到后端。然后,我们的后端解码了Base64输入,并使用Newtonsoft JSON将其转换为动态对象(实际上,它被转换为强类型类,回退是动态的)。我同意,这很粗糙,但它奏效了。
我不确定它是否会有帮助,但我在上面的评论中提到,我最终使用了一个自定义模型绑定器来完成这项工作。我发现了我认为是引发这个问题的原始代码,这就是我最终得到的:
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();
这似乎是不可能的。阅读MSDN文档https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.aspx:
操作方法不能具有无边界的泛型类型参数。一无界泛型类型参数的参数列表为空。一无界泛型类型也称为开放泛型类型。对于有关无界泛型类型参数的信息,请参阅一节类型参数约束中的"无边界类型参数"。
你应该从APIController派生,或者创建一个CustomModelBinder(我不确定这个)
看看以下链接:
将JObject发布到动作
类型对象的.NET MVC Action参数
抽象类可以是控制器中的参数吗;s的行动?
希望它能有所帮助!