MVC提交数据的时候后台参数类型问题

dabaicai 2014-10-09 03:36:52
js:
cost1赋值...
$.post(convertUrl('~/Maintains/RegistCost1/'), cost1, function (res) {
}

后台controllers里面:
[HttpPost]
public ActionResult RegistCost1(参数类型 cost)
{}

如果我前台提交的是一条记录,cost1作为一个对象,参数类型用class没有问题,一切正常
可是如果我准备前台提交好几条数据,cost1用array或者数组的时候,后台这个参数类型应该用什么?我用list<>是null,
现在就是后台定义不了类型,接收不到数据
...全文
273 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
dabaicai 2014-10-11
  • 打赏
  • 举报
回复
和这个帖子类似 http://bbs.csdn.net/topics/390238582 不过那个1楼的方法在c#里面不知道怎么写
dabaicai 2014-10-11
  • 打赏
  • 举报
回复
问题是这个数组是不固定的咋办? 有时候3条 有时候4条。。。。
ayanamireizero 2014-10-11
  • 打赏
  • 举报
回复
把数组拆了,AJAX用 $.post("xxxxx",{ cost1:aaaa,cost2:bbbb,cost3:cccc },function(){}) public ActionResult RegistCost1(string cost1,string cost2,string cost3)
dabaicai 2014-10-11
  • 打赏
  • 举报
回复
现在的问题就是我前台用class对象传,后台定义 class变量收没问题 但是前台传的是一个对象数组(多条数据),后台怎么收都收不到,怎么办
dabaicai 2014-10-11
  • 打赏
  • 举报
回复
引用 5 楼 qq_15115039 的回复:
var cost1 = { }; cost1.a = 1; cost1.b = 2; var cost = new Array(); cost.push(cost1); cost.push(cost1); $.post('', { c: cost }, function (res) { }); 后台List<classcost>的变量名是c 必须和post里面的c一样
能收到了,但是我后台收到的List<> 里面的每个值还是null,调试前台是有数据的
dabaicai 2014-10-11
  • 打赏
  • 举报
回复
OK,搞定,谢谢matrixkey ,还有newxdlysk , 虽然newxdlysk 早就说了方法,不过我菜,不写详细搞不定 ,哈哈
gw6328 2014-10-11
  • 打赏
  • 举报
回复
json反序列化
dabaicai 2014-10-11
  • 打赏
  • 举报
回复
我现在在object obj = js.Deserialize(jsonRsp[i].CreateReader(), typeof(T)); 这一步的时候提示object转换成我的类的时候出错,但我没查出来什么错。。。。。。。 再查查
落阳 2014-10-11
  • 打赏
  • 举报
回复
楼主看这个 js部分:
var arrayPermission = [];
arrayPermission.push({ MenuID: 1, Function: 浏览 });
arrayPermission.push({ MenuID: 1, Function: 新增 });
var param = { roleFunction: JSON.stringify(arrayPermission), roleId: selectRole.attributes.ID };
后台action部分:
public ActionResult SaveRolePermission([ModelBinder(typeof(JsonBinder<PermissionField>))]List<PermissionField> roleFunction, int roleId, string otherRoleIds)
{...}
PermissionField类定义:
/// <summary>
        /// 权限字段
        /// </summary>
        public class PermissionField
        {
            /// <summary>
            /// 菜单ID
            /// </summary>
            public int MenuID { get; set; }

            /// <summary>
            /// 功能点名称
            /// </summary>
            public string Function { get; set; }
        }
JsonBinder部分:
/// <summary>
    /// Json数据绑定类 对json数据反序列化
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class JsonBinder<T> : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            //从请求中获取提交的参数数据 
            var json = controllerContext.HttpContext.Request.Form[bindingContext.ModelName] as string;
            //提交参数是对象 
            if (json.StartsWith("{") && json.EndsWith("}"))
            {
                JObject jsonBody = JObject.Parse(json);
                JsonSerializer js = new JsonSerializer();
                object obj = js.Deserialize(jsonBody.CreateReader(), typeof(T));
                return obj;
            }
            //提交参数是数组 
            if (json.StartsWith("[") && json.EndsWith("]"))
            {
                IList<T> list = new List<T>();
                JArray jsonRsp = JArray.Parse(json);
                if (jsonRsp != null)
                {
                    for (int i = 0; i < jsonRsp.Count; i++)
                    {
                        JsonSerializer js = new JsonSerializer();
                        object obj = js.Deserialize(jsonRsp[i].CreateReader(), typeof(T));
                        list.Add((T)obj);
                    }
                }
                return list;
            }
            return null;
        }
    }
需要引用json.net,然后就可以using Newtonsoft.Json 和 Newtonsoft.Json.Linq
  • 打赏
  • 举报
回复

            str = "cost1.a:1,cost1.b:1|cost2.a:2,cost2.b:2";

            var da = "{'costs':[{a:'1', b:'1'}, {a:'2', b:'2'}]}";
            var data = {"data":str};
用str或者da都行啊,str就是纯粹一个字符串string data接收,完了自己分割 | 获取每个对象 分割,获取属性 分割:获取值, 用da的话就是用json序列化。
qq_15115039 2014-10-09
  • 打赏
  • 举报
回复
var cost1 = { }; cost1.a = 1; cost1.b = 2; var cost = new Array(); cost.push(cost1); cost.push(cost1); $.post('', { c: cost }, function (res) { }); 后台List<classcost>的变量名是c 必须和post里面的c一样
newxdlysk 2014-10-09
  • 打赏
  • 举报
回复
实现自己的ModelBinder public class JsonModelBinder<TType> : DefaultModelBinder where TType:class { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var json = controllerContext.RequestContext.HttpContext.Request.Form[0]; json = Regex.Match(json, @"(?s)\{.+\}").Value; var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<TType>(json); return obj; } } 使用的时候 [HttpPost] public ActionResult xxx([ModelBinder(typeof(JsonModelBinder<xxxyyy>))]xxxyyy model)
mc_dv 2014-10-09
  • 打赏
  • 举报
回复
前台拼接好一条数据后加个逗号, 后台分割逗号. 每一条都分开了 . 这种思路可以不 .
dabaicai 2014-10-09
  • 打赏
  • 举报
回复
我说的不详细么? js: 如果是这样: cost1.a = 1; cost1.b=2; 后台参数类型用 classcost 数据能传递过来 但是如果我前面是 cost1=new array() cost1.push(obj1);//obj就是上面成功的cost1内容 cost1.push(obj2) 后台参数类型处不知道怎么写,总是传不过来,写List<classcost>不行,是null, 大侠们帮帮忙
jun471537173 2014-10-09
  • 打赏
  • 举报
回复
cost1用array或者数组的时候,后台这个参数类型应该用什么?我用list<>是null, 有例子么

62,242

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧