使用jquery传递复杂Json数据——[ModelBinder(typeof(JsonBinder<复杂实体类>))]

调用jQuery的ajax方法时,jQuery会根据post或者get协议对参数data进行序列化;

如果提交的数据使用复杂的json数据,例如:

{userId:32323,userName:{firstName:"李",lastName:"李大嘴"}}

那么服务器是无法正常接收到完整的参数,因为jQuery对data的序列化,是使用了键值对拼装的方式;

参数拼装成 userId=32323&userName=object ; userName所指向的对象被序列化成字符串"object"

 

        public ActionResult Add([ModelBinder(typeof(JsonBinder<CostItem>))]CostItem costItem)

如果在ASP.NET MVC使用了参数名为`action`,那么会出现参数名和关键字`action`冲突的问题。这时候可以使用以下两种方式解决: 1. 在Action方法中使用特性指定参数名 在Action方法中,可以通过`ActionName`特性指定参数名,例如: ```csharp public ActionResult MyAction([ActionName("myAction")] string action) { // Do something } ``` 这样就可以在URL中使用`myAction`参数名来传递参数,而不会和关键字`action`冲突了。 2. 使用自定义Model绑定器 可以使用自定义的Model绑定器来处理参数名和关键字冲突的问题。例如,可以定义一个`MyActionParameter`类,然后在自定义Model绑定器中判断参数名是否为`action`,如果是则将其替换为自定义的参数名: ```csharp public class MyActionParameter { public string MyAction { get; set; } } public class MyActionParameterBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var valueProviderResult = bindingContext.ValueProvider.GetValue("action"); if (valueProviderResult != null) { var myAction = valueProviderResult.AttemptedValue; return new MyActionParameter { MyAction = myAction }; } else { return null; } } } ``` 然后在Controller中,可以将参数类型改为`MyActionParameter`,并在参数前加上`ModelBinder`特性指定使用自定义的Model绑定器: ```csharp public ActionResult MyAction([ModelBinder(typeof(MyActionParameterBinder))] MyActionParameter parameter) { var myAction = parameter.MyAction; // Do something } ``` 这样就可以在URL中使用`action`参数名来传递参数,而不会和关键字`action`冲突了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值