代码之家  ›  专栏  ›  技术社区  ›  DavidAndroidDev

ASP.netMVC—强类型对象,表示传递给视图的Json对象

  •  2
  • DavidAndroidDev  · 技术社区  · 15 年前

    这样做的主要原因是我们可以对发送给它的对象进行单元测试。

    谢谢!

    编辑:

    [AcceptVerbs(HttpVerbs.Post)]
            public JsonResult GridData(FormCollection form, string alias, string location, string state)
            {
                int pageSize = Convert.ToInt32(form["rows"]);
                int pageIndex = Convert.ToInt32(form["page"]) - 1;
                var deviceList = this._device.GetList(CreateFilter(location,alias,state),this._securityCache.GetSecurityContext(),pageSize,pageIndex);
                int totalResults = deviceList.TotalRecords;
                int totalPages = (int)Math.Ceiling((float)totalResults / (float)pageSize);
                var jsonData = new {
                    total = totalPages,
                    page = pageIndex + 1,
                    records = totalResults,
                    rows = (from device in deviceList.Data
                            select new {i = device.Alias,cell = new string[]{device.Alias,device.Location,device.RatePlan,device.State,device.DateCreated.ToString()}}).ToArray()
                    }; 
    return Json(jsonData);
    

    var newJsonData = new JsonJQGridReturnData(); 
                    newJsonData.total = totalPages;
                    newJsonData.page = pageIndex + 1;
                    newJsonData.records = totalResults;
                    List<JsonJQGridRow> list = new List<JsonJQGridRow>();
                    foreach (var device in deviceList.Data)
                    {
                        list.Add(new JsonJQGridRow(device.Alias, new string[] { device.Alias, device.Location, device.RatePlan, device.State, device.DateCreated.ToString() }));
                    }
                    newJsonData.rows = list.ToArray();      
                    _cookieHelper.SaveCookie("DeviceListIndex", this._securityCache.GetSecurityContext().UserID.ToString(), COOKIE_PAGE_SIZE_KEY, pageSize.ToString());
                    return Json(newJsonData);
                }
    

    下面是我试图将这些对象包装成强类型对象的拙劣尝试。不幸的是,运行这个命令会在jqGrid文件中给我一个“u是未定义的”。我怀疑这是因为传入的json格式不正确。以下是课程。。。。

    [DataContract]
        public class JsonJQGridReturnData
        {
            [DataMember]        
            public int total { get; set; }
    
            [DataMember]
            public int page { get; set; }
    
            [DataMember]
            public int records { get; set; }
    
            [DataMember]
            public JsonJQGridRow[] rows { get; set; }
        }
    
        [DataContract]
        public class JsonJQGridRow
        {
            public JsonJQGridRow(string i, string[] columns)
            {
                this.i = i;
                this.cells = columns;
            }
    
            [DataMember]
            public string i { get; set; }
    
            [DataMember]
            public string[] cells { get; set; }
        }
    
    4 回复  |  直到 15 年前
        1
  •  3
  •   Francis Shanahan    15 年前

    型号:

    // represents one row in the JQGrid
            class Customer
            {
                public string firstname { get; set; }
                public string lastname { get; set; }
            }
    

    JQGrid等级:

        class JQGridData<TModel>
                {
    // add in whatever other properties you want for JQGrid
                    public int responseTime {get; set; };
                    public List<TModel> rows = new List<TModel>(); 
                }
    

    控制器操作:

    public JsonResult GridData(int page)
            {
                var gridData = new JQGridData<Customer>();
    
    // Populate your data here, this is just an example: 
                gridData.rows.Add(new Customer()
                {
                    firstname = "fred", lastname = "pharkas"
                });
    
    // return the result
                return Json(gridData, JsonRequestBehavior.AllowGet); 
            }
    

    结果:

    {    
         responseTime: 0       
          rows: [         
                {
                    firstname: "fred"
                    lastname: "pharkas"
                }
          ]    
    }
    

        2
  •  0
  •   jim tollan    15 年前

    大卫,

    这是我目前正在开发的一个应用程序中使用的一种东西。我知道它本身并没有提供强类型对象,但是“list”可以是模型的一部分,然后在文章末尾发送到array()。

    public JsonResult GridData(int id)
    {
        // get our messages based on id
        var bookingmessagesList = _repository.Find(x => x.ID == id);
        var list = new ArrayList();
        foreach (var bookingmessage in bookingmessagesList) //populate data containers with read data
        {
            list.Add(new
                    {
                        bookingmessage.ClassRowVersionDate,
                        bookingmessage.ID,
                        bookingmessage.BookingID,
                        bookingmessage.AssignedFrom,
                        bookingmessage.AssignedTo,
                        bookingmessage.AssignedDate,
                        bookingmessage.CompletedDate,
                        bookingmessage.MessageType,
                        bookingmessage.Notes
                    });
        }
        int totalOjectCount = list.Count;
        return Json(new { dataitems = list.ToArray(), totalItems = totalOjectCount });
    }
    

    希望能给你一些想法。。我很想看看你的建议。

        3
  •  0
  •   tvanfosson    15 年前

    下面是对强类型JQGridResult的快速介绍。

    public class JQGridResult<T> : JsonResult where T : class
    {
        public T Model
        {
            get { return (T)this.Data; }
            set { this.Data = value; }
        }
    }
    

    用作。。。

    return new JQGridResult<JsonModel> {
         Model = new GridModel  { ... initialize model here ... }
    });
    

    其中GridModel基本上是一个容器类,包含网格的强类型属性。

        4
  •  0
  •   DavidAndroidDev    15 年前

    我觉得很傻。我在GridRow中有一个拼写错误,导致jqGrid爆炸。在我解决了这个问题之后,我可以让jqGrid处理我的强类型对象。。。

    在我的单元测试中,我可以。。。

    var result = controllerToTest.GridData(form, null, null, null) as JsonResult;
    var data = result.Data as JsonJQGridReturnData;
    

    现在我可以访问字段:D