Я пытаюсь развернуть сайт ASP.NET MVC на сервере Windows 2003, IIS 6.0 с установленной платформой 3.5 (но не ASP.NET MVC - он просто находится в папке bin). Сайт использует jqGrid, но в некоторых случаях на сервере развертывания происходит сбой сетки.
Главная страница веб-сайта находится по адресу /Views/Shared/Site.Master. Он имеет тег script для включения JavaScript для инициализации и загрузки jqGrid.
Я обнаружил, что при развертывании ни JavaScript, ни "/", ни ASP "~" не приводили к абсолютным путям к файлам скриптов. Мне нужно было добавить код, чтобы убедиться, что путь указан полностью:
<script type="text/javascript" src=<%= VirtualPathUtility.ToAbsolute("~/Scripts/searchControls.js") %> ></script>
URL-адрес в функции инициализации jqGrid включает путь к методу контроллера для получения начальных данных, например:
jQuery("#searchResultList").jqGrid({
url: './Report.mvc/GetResultsL2E/',
datatype: 'json',
mtype: 'GET',
colNames: ['', 'ID', 'Title', 'Post_Date', 'Start_Date', 'End_Date', 'Summary', 'Categories', 'Affected Places'],
colModel: [
{ name: 'act', index: 'act', width: 75, sortable: false },
{ name: 'ID', index: 'ID', width: 40, align: 'left', hidden: true },
{ name: 'Title', index: 'Title', width: 150, align: 'left' },
{ name: 'Post_Date', index: 'Post_Date', width: 80, align: 'left' }, //, formatter: 'date' },
{ name: 'Start_Date', index: 'Start_Date', width: 80, align: 'left' }, //, formatter: 'date' },
{ name: 'End_Date', index: 'End_Date', width: 80, align: 'left' }, //, formatter: 'date' },
{ name: 'Summary', index: 'Summary', width: 240, align: 'left' },
{ name: 'Categories', index: 'Categories', width: 140, align: 'left' },
{ name: 'Affected Places', index: 'AffectedPlaces', width: 140, align: 'left' }
],
pager: jQuery('#searchResultPager'),
rowNum: 10,
rowList: [5, 10, 20, 50],
sortname: 'Title',
sortorder: 'asc',
imgpath: './Scripts/jqGrid/themes/green/images',
caption: 'Report Search Results',
editurl: './Report.mvc/Edit/',
height: 'auto',
multiselect: true,
multiboxonly: true, //adds check box column
viewrecords: true,
recordtext: ' Reports',
pgtext: ' of ',
altRows: true,
loadComplete: function() {
var ids = jQuery("#searchResultList").getDataIDs();
for (var i = 0; i < ids.length; i++) {
var cl = ids[i];
be = "<a href='./Report.mvc/Edit/" + cl + "' title='Edit'><img src='./Content/Images/Icons/Edit.png' border='0' alt='Edit' /></a>";
se = "<a href='./Report.mvc/Details/" + cl + "' title='View'><img src='./Content/Images/Icons/view.png' border='0' alt='View' /></a>";
ce = "<a href='./Report.mvc/Delete/" + cl + "' title='Delete'><img src='./Content/Images/Icons/delete.png' border='0' alt='Delete' /></a>";
jQuery("#searchResultList").setRowData(ids[i], { act: be + se + ce })
}
}
}).navGrid('#searchResultPager',
{ edit: false, add: false, del: false, search: false }, //options
{ height: 280, reloadAfterSubmit: false }, // edit options
{ height: 280, reloadAfterSubmit: false }, // add options
{ reloadAfterSubmit: false }, // del options
{} // search options
);
Я также обнаружил, что мне нужно добавить точку, чтобы это работало на сервере IIS 6. Но это работает.
Проблема в том, что у меня есть ссылки в столбце 'act' для перехода на страницу редактирования. Страница редактирования использует ту же главную страницу и, следовательно, те же сценарии. Тем не менее, URL-адрес страницы - /MyWebApp/Report.mvc/Edit/# (где # - идентификатор редактируемого отчета). И jqGrid не будет инициализироваться.
В консоли Firebug я вижу ошибку:
jQuery("#searchResultList").jqGrid is not a function
loadComplete: function() {\r\n
я уверен, что это фальшивка, потому что я вижу только одно изменение - URL теперь на один уровень глубже (/Report.mvc/Edit vs. /Report.mvc).
В этой сети есть ряд причудливых вещей, и, как подрядчик, я не могу их контролировать и не намного больше контролирую сервер.
Я думаю, что это проблема с обработкой URL в jqGrid, потому что я попытался установить для параметра url следующие значения:
http://server_name/MyWebApp/Report.mvc/GetResultsL2E/ and
/MyWebApp/Report.mvc/GetResultsL2E/
В обоих случаях возникали ошибки скрипта на всех страницах, ссылаясь на то, что s.data или s.url не являются функцией в скрипте jQuery.js.
У кого-нибудь есть советы, как заставить это работать в моей среде развертывания?
UPDATE:
Я давно работал над этой проблемой, но теперь я обнаружил, что тестовый сервер, который имел эти странные причуды, является виртуальным сервером. Я пытаюсь выяснить, имеет ли это какое-либо отношение к этой и другим проблемам в этой конкретной сети.