Почему я загружаю страницу aspx вместо того, чтобы просто перейти к ней в MVC 2 - PullRequest
0 голосов
/ 02 июня 2011

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

Кажется разумным, верно?С какой стати она загружает страницу, а не перенаправляет на нее?Что, черт возьми, я могу здесь делать неправильно?Ну, наверное, много, но я думаю, что мне просто не хватает чего-то простого.

Ответы [ 2 ]

0 голосов
/ 03 июня 2011

Хорошо.Я думаю, что я понял это.Я не хочу перенаправлять на действие.Действие возвращает тип данных Json, и это просто текст, поэтому браузер просто пытается его загрузить.Я хочу перенаправить на представление ... Итак, я сделал вспомогательную функцию, которая возвращает данные json, и я перенаправляю на контроллер dataGrid.Но сценарий Json теперь вызывает вспомогательную функцию, и это сработало ... За исключением ошибки Javascript, которая, как я знаю, знает, как ее решить (в основном это ошибка форматирования, поэтому, если я нажму мимо нее, она будет отображаться).

В любом случае, спасибо за помощь, ребята.

Дерек

PS вот мое закодированное решение, если вы хотели бы проверить его сами, если у вас возникла такая же проблема ... jqGrid call

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, которые отображаются в виде ...

Если у кого-то есть лучший способ сделать это, пожалуйста, ответьте.Но спасибо за помощь.

Дерек

0 голосов
/ 02 июня 2011

Я считаю, что ваша проблема здесь:

if (nextButton != null)
            return RedirectToAction("GridData");

Возможно, вы пытаетесь перенаправить ваш взгляд на действие, которое фактически возвращает результат JSON.

Попытайтесь удалить эти строки и посмотрите, что произойдет.

ОБНОВЛЕНИЕ:

Мне кажется, вы неправильно понимаете, как работает MVC,Чтобы решить вашу проблему, вы можете попытаться очистить свой Action View так, чтобы он выглядел так:

public ActionResult Index()
    {
        return View();
    }

Тогда вам нужно иметь ассоциированное представление, которое должно содержать ваш jqGrid.Затем вам нужно выполнить действие, которое просто возвращает некоторые данные JSON.Это действие всегда будет вызываться (и только) вашим jqGrid.Это именно то, что делает ваша GridData.Вы не перенаправляете на GridData причину, которая вызывается из jqGrid.

Крейг Штунц получил хороший учебник по этому поводу.Этот один тоже может помочь.

Вы можете скачать мой пример кода здесь .

...