ASP.net MVC - 强类型对象,表示我传递给视图的Json对象

时间:2010-09-20 14:59:36

标签: asp.net-mvc json jqgrid

我正在使用jqGrid在页面上显示一些数据。在控制器操作中,我们使用匿名对象来表示jqGrid需要的数据。我的问题是,有没有办法可以创建一个强类型对象来表示我们用Json()发送的jqGrid数据?

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

谢谢!

编辑:

[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);

上面这个有用,但是我们无法对传递给Json()方法的数据进行单元测试。

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 is undefined”。我怀疑这是因为传入的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 个答案:

答案 0 :(得分:3)

如果我理解你的问题,你可以使用Generics来做到这一点:

型号:

// 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"
            }
      ]    
}

这就是你问的问题吗?

答案 1 :(得分:0)

大卫,

这是我在一个应用程序中使用的那种东西,我正在为这类事物工作。我知道它不提供强类型对象,但是'list'可以是模型的一部分,然后在片段的末尾发送ToArray()。

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 });
}

希望它能给你一些想法..有兴趣看看提出的建议。

答案 2 :(得分:0)

这是一个强类型的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基本上是一个容器类,包含网格的强类型属性。

答案 3 :(得分:0)

我觉得很傻。我在GridRow中发生了拼写错误,导致jqGrid爆炸。在我修复之后,我能够让jqGrid与我的强类型对象一起工作......

现在在我的单元测试中,我可以做...

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

现在我可以访问字段:D