如何在asp.net mvc post方法中获取动态参数

时间:2014-04-10 10:15:50

标签: asp.net-mvc post dynamic

我试图制作一些像这样的帖子方法:

客户端:

$.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]一样。

那么有没有简单的方法将客户发布数据传输到动作中的动态对象?

1 个答案:

答案 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 )
{
}