Я использую jqgrid (стандарт) с EF 4 + MVC3 . Я хотел бы реализовать экспорт Excel и, если возможно, использовать тот же контроллер действий, который использовался для заполнения сетки.
Интересно, возможно ли / логично передать дополнительный параметр, например. Какой метод вы мне предложите?
Я задаю этот вопрос, потому что я все еще пытаюсь реализовать экспорт в Excel, и я бы хотел оптимизировать / повторно использовать код, если это возможно.
Чтобы сгенерировать Excel, Я бы хотел использовать эту библиотеку доктора Стивена Вальтера, которая имеет три типа вывода и позволяет также определять заголовки. Пожалуйста, скажите мне, если вы найдете это действительным для моих целей.
О коде jqgrid я нашел этот интересный ответ Олега , но я не понимаю, можно ли применить его к моим потребностям.
К сожалению, к настоящему времени я нашел только части решений для экспорта в Excel с EF MVC, но решения или полных примеров не было ...
Вот частичное представление _Index, содержащее мой jqgrid
<table id="mygrid"></table>
<div id="pager2"></div>
jQuery("#mygrid").jqGrid({
url:'controller/jqIndex',
datatype: "json",
colNames:['id','field1', ...],
colModel:[
{name:'id',index:'id', width:55},
{name:'field1',index:'field1', width:90},
...
],
rowNum:10,
rowList:[10,20,30],
pager: '#pager2',
sortname: 'id',
viewrecords: true,
sortorder: "desc",
caption:"modal jquery + jqgrid test"});
jQuery("#list2").jqGrid('navGrid','#pager2',{edit:false,add:false,del:false});
//TODO
???
...some code to call the controller action with the `excel` parameter set `true`
КОНТРОЛЛЕР (НА ОСНОВЕ ОСУЩЕСТВЛЕНИЕ ОЛЕГА )
public ActionResult jqIndex(string sidx, string sord, int page, int rows, bool _search, string filters, bool excel) // note the excel parameter <<
{
var context = new TManagerContext();
var objectContext = context.ObjectContext();
var set = objectContext.CreateObjectSet<Ticket>();
var serializer = new JavaScriptSerializer();
Filters f = (!_search || string.IsNullOrEmpty(filters)) ? null : serializer.Deserialize<Filters>(filters);
ObjectQuery<Ticket> filteredQuery = (f == null ? (set) : f.FilterObjectSet(set));
filteredQuery.MergeOption = MergeOption.NoTracking; // we don't want to update the data
int totalRecords = filteredQuery.Count();
var pagedQuery = filteredQuery.Skip("it." + sidx + " " + sord, "@skip",
new ObjectParameter("skip", (page - 1) * rows))
.Top("@limit", new ObjectParameter("limit", rows));
int pageIndex = Convert.ToInt32(page) - 1;
int pageSize = rows;
int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);
var queryDetails = (from e in pagedQuery
select new
{
e.TicketID,
e.field1,
...
}).ToList();
var result = new
{
total = totalPages,
page = page,
records = totalRecords,
rows = (from e in queryDetails
select new
{
id = e.TicketID,
cell = new string[]
{
e.field1,
...
}
}).ToArray()
};
if (excel) {
ExportExcel(result); // if possible, pass filter parameters too, column order, etc...
}
return Json(result, JsonRequestBehavior.AllowGet);
}
Пожалуйста, извините, если вопрос может быть глупым, я просто начинающий (энтузиаст).
Спасибо за вашу драгоценную помощь!
С наилучшими пожеланиями