【问题标题】:ASP.net MVC - Strongly typed object to represent a Json Object that I pass to the viewASP.net MVC - 强类型对象来表示我传递给视图的 Json 对象
【发布时间】:2010-09-20 14:59:35
【问题描述】:

我正在使用 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; }
    }

【问题讨论】:

  • 我怀疑您的问题中缺少某些内容。你想要一个强类型的 JsonResult 吗?比如,一个 JQGridResult?

标签: asp.net-mvc json jqgrid


【解决方案1】:

如果我理解您的问题,您可以使用泛型来执行此操作:

型号:

// 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】:

    大卫,

    这是我目前正在为此类事情开发的应用程序中使用的一种东西。我知道它本身并没有提供强类型对象,但“列表”可能是模型的一部分,然后在文章末尾发送 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 });
    }
    

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

    【讨论】:

    • 这与我们现在所做的非常接近。这很好用,但不提供对数据进行单元测试的能力。
    【解决方案3】:

    这里是强类型 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】:

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

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

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

      现在我可以访问这些字段了:D

      【讨论】:

      • 好吧,在发布之后......我想这些不是强类型的。但它比以前更可测试。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      相关资源
      最近更新 更多