#asp.net-mvc-2 #asp.net-mvc-routing
#asp.net-mvc-2 #asp.net-mvc-routing
Вопрос:
Это, вероятно, самый глупый вопрос, когда-либо задававшийся в stack Overflow. Но я получаю самые странные результаты от некоторого кода, с которым я работаю. Я пытаюсь заставить jqGrid работать в моем приложении MVC 2.
В моем домашнем контроллере есть метод действия для Index и GridData… GridData принимает 4 параметра, 2 из них не могут быть нулевыми, поэтому я добавляю к ним атрибут defalutValue со значением единицы. Контроллер индекса перенаправляет на метод действия GridData, который затем открывает представление GridData… Я не возвращаю представление в этой функции, но я возвращаю переменную Json…
[Authorize(Roles="testRole")]
public ActionResult Index(string nextButton)
{
ViewData["identity_Name"] = identity.Name;
if (nextButton != null)
return RedirectToAction("GridData");
return View("Index");
}
public ViewResult windowsID()
{
return View();
}
public ActionResult GridData(string sidx, string sord, [DefaultValue(1)] int page, [DefaultValue(1)] int rows)
{
var jsonData = new
{
total = 1, // we'll implement later
page = page,
records = 3, // implement later
rows = new[]
{
new {id = 1, cell = new[] {"1", "-7", "Is this a good question?"}},
new {id = 2, cell = new[] {"2", "15", "Is this a blatant ripoff?"}},
new {id = 3, cell = new[] {"3", "23", "Why is the sky blue?"}}
}
};
return Json(jsonData, JsonRequestBehavior.AllowGet);
}
}
Вот большая часть моего кода Javascript.
<script type="text/javascript">
jQuery(document).ready(function () {
jQuery("#list").jqGrid({
url: '/Home/GridData/',
datatype: 'json',
mtype: 'GET',
colNames: ['Id', 'Votes', 'Title'],
colModel: [
{ name: 'Id', index: 'Id', width: 40, align: 'left' },
{ name: 'Votes', index: 'Votes', width: 40, align: 'left' },
{ name: 'Title', index: 'Title', width: 200, align: 'left'}],
pager: jQuery('#pager'),
rowNum: 10,
rowList: [5, 10, 20, 50],
sortname: 'Id',
sortorder: "desc",
viewrecords: true,
imgpath: '/scripts/themes/smoothness/images',
caption: 'My first grid'
});
});
Кажется разумным, не так ли? С какой стати ему загружать страницу вместо перенаправления на нее? Что, черт возьми, я мог бы здесь сделать не так. Ну, я думаю, много, но я думаю, что я просто упускаю что-то простое.
Ответ №1:
ОК. Я думаю, что я понял это. Я не хочу перенаправлять на действие. Действие возвращает тип данных Json, и это просто текст, поэтому браузер просто попытается загрузить его. Я хочу перенаправить на представление… Итак, что я сделал, это создал вспомогательную функцию, которая возвращает данные json, и я перенаправляю их на контроллер DataGrid. Но Json-скрипт теперь вызывает вспомогательную функцию, и это сработало… За исключением ошибки Javascript, которую я знаю, как решить (это в основном ошибка форматирования, поэтому, если я нажму мимо нее, она отобразится).
В любом случае, ребята, спасибо за помощь.
Дерек
P.S вот мое кодированное решение на случай, если вы захотите проверить его самостоятельно, если у вас такая же проблема… Вызов jqGrid
jQuery(document).ready(function () {
jQuery("#list").jqGrid({
url: '/Home/GetData/',
datatype: 'json',
Вот мои действия внутри контроллера.
public JsonResult GetData(string sidx, string sord, [DefaultValue(1)] int page, [DefaultValue(3)] int row)
{
var jsonData = new
{
total = 1, // we'll implement later
page = page,
records = 3, // implement later
rows = new[]
{
new {id = 1, cell = new[] {"1", "-7", "Is this a good question?"}},
new {id = 2, cell = new[] {"2", "15", "Is this a blatant ripoff?"}},
new {id = 3, cell = new[] {"3", "23", "Why is the sky blue?"}}
}
};
return Json(jsonData, JsonRequestBehavior.AllowGet);
}
public ActionResult GridData()
{
return View("GridData");
}
Как вы можете видеть, после перенаправления на GridData (), которая вызывает представление griddata, jqGrid затем вызывает getData() . Затем getData возвращает данные Json, которые отображаются в представлении…
Если у кого-нибудь есть лучший способ сделать это, пожалуйста, ответьте. Но спасибо за помощь.
Дерек
Ответ №2:
Я считаю, что ваша проблема здесь:
if (nextButton != null)
return RedirectToAction("GridData");
Вероятно, вы пытаетесь перенаправить свой просмотр на действие, которое фактически возвращает результат JSON.
Попробуйте повторить эти строки и посмотрите, что получится.
Обновить:
Мне кажется, вы неправильно понимаете, как работает MVC. Чтобы решить вашу проблему, вы можете попробовать очистить свой action View, чтобы он выглядел следующим образом:
public ActionResult Index()
{
return View();
}
Затем вам нужно иметь связанный вид, который должен содержать вашу jqGrid.
Затем вам нужно выполнить действие, которое просто возвращает некоторые данные json.
Это действие всегда будет вызываться (и только) вашим jqGrid.
Это именно то, что делает ваш GridData.
Вы не перенаправляете на GridData, потому что это вызывается из jqGrid.
У Крейга Штунца есть хороший учебник по этому поводу. Это тоже может помочь.
Вы можете скачать мой пример кода здесь.
Комментарии:
1. Уверен, что это не так. Но это натолкнуло меня на идею. Я перенаправил на конкретный контроллер и действие. К сожалению, я получил тот же результат. Я гарантирую, что никогда не смог бы этого сделать, даже если бы попытался.
2. @user729820: Проверьте также свою маршрутизацию.
3. Просматривал мою маршрутизацию. Что именно в моем механизме маршрутизации заставило бы меня загружать страницу вместо простого перенаправления на нее?
4. Вот мысль, похоже, я пытаюсь перенаправить на контроллер DataGrid. Но контроллер DataGrid возвращает данные Json, которые, насколько я понимаю, являются просто текстом, верно? Таким образом, я бы, по сути, просто загружал текстовый файл с данными Json (если вы откроете текстовый файл, который я получаю, это то, что вы видите). Итак, функция DataGrid не вызывается jquery, поэтому эта функциональность не вызывается. Есть какие-нибудь советы о том, как перенаправить на представление, чтобы я мог выполнить это вместо действия? Это вообще правильный способ что-то делать? Кажется, что перенаправление доставляет много хлопот.
5. @user729820: Я обновил свой ответ. Вам нужно немного больше понять о MVC и JSON. JSON — это в основном текст. Вам не нужно ничего перенаправлять. Ваш jqGrid выполняет вызов ajax для вашего действия, которое передает JSON. Не забудьте проголосовать за меня, если вы удовлетворены 🙂