ASP.net MVC - строго типизированный объект для представления объекта Json, который я передаю представлению - PullRequest
2 голосов
/ 20 сентября 2010

Я использую jqGrid для отображения некоторых данных на странице.В рамках действия контроллера мы используем анонимный объект для представления данных, необходимых для jqGrid.У меня вопрос, есть ли способ, которым мы можем создать строго типизированный объект для представления данных jqGrid, которые мы отправляем с Json ()?

Основная причина этого заключается в том, что мы можем проводить модульное тестирование с объектамикоторые отправляются на него.

Спасибо!

РЕДАКТИРОВАТЬ:

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

Вот моя неудачная попытка обернуть их в строго типизированные объекты.К сожалению, выполнение этого дает мне "u не определено" в файле jqGrid.Я подозреваю, что это потому, что передаваемый 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 ]

3 голосов
/ 20 сентября 2010

Если я понимаю ваш вопрос, вы можете использовать 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"
            }
      ]    
}

Это то, что вы спрашивали?

0 голосов
/ 20 сентября 2010

Я чувствую себя действительно глупо. У меня была ошибка в GridRow, которая вызывала взрыв jqGrid. После того, как я это исправил, я смог заставить jqGrid работать с моим строго типизированным объектом ...

Теперь в моих юнит-тестах я могу просто ...

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

и теперь я могу получить доступ к полям: D

0 голосов
/ 20 сентября 2010

Вот быстрый взгляд на строго типизированный 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 - это в основном контейнерный класс, содержащий строго типизированные свойствасетка.

0 голосов
/ 20 сентября 2010

Дэвид,

Вот такая штука, которую я использую в приложении, над которым я сейчас работаю, для такого рода вещей.Я знаю, что он не предоставляет строго типизированный объект как таковой, но «список» может быть частью модели, которая затем отправляется 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 });
}

надеюсь, что это даст вам некоторые идеи. Будет интересно увидеть сделанные предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...