我试图制作一些像这样的帖子方法:
客户端:
$.post("/control/PostMethod",{a:1,b:2,c:[1,2,3],d:{x:1,y:0}})
服务器端:
[HttpPost]
public int PostMethod(dynamic model)
{
//do something with model.a model.b etc.
return 1;
}
问题是如果我什么也没做,模型似乎是一个没有属性的简单对象,所以我试着写一个CustomModelBinder
替换DefaultModelBinder
并覆盖CreateModel
方法分析表单值。但我发现它变得非常困难,因为属性已经扩展,就像属性d
在表单值中变为a[d][x],a[d][y]
一样。
那么有没有简单的方法将客户发布数据传输到动作中的动态对象?
答案 0 :(得分:0)
如果您还能够提供有关该类型的信息,您可以使用自定义模型绑定器并提供必要的类型信息。我有一个模型绑定器,可以扫描"类型" querystring-value,用于为模型绑定器提供所需的信息。
public class MyModelBinder : DefaultModelBinder
{
public override object BindModel( ControllerContext controllerContext, ModelBindingContext bindingContext )
{
// Check if the model type is object
if (bindingContext.ModelType == typeof( object ))
{
// Try to get type info from the query string or form-data
var type = controllerContext.HttpContext.Request.QueryString["type"] ??
controllerContext.HttpContext.Request.Form["type"];
if (type != null )
{
// Find a way to get type info, for example
var matchingType = Assembly.GetExecutingAssembly().GetType(type);
// Supply the metadata for our bindingcontext and the default binder will do the rest
bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType( null, matchingType );
}
}
return base.BindModel( controllerContext, bindingContext );
}
}
我的控制器方法如下所示:
public ActionResult Method( string type, object model )
{
}