RedirectToAction не работает при вызове jQuery? - PullRequest
2 голосов
/ 28 декабря 2010

Я пытаюсь вызвать метод действия с помощью jQuery, и получил помощь по передаче параметров здесь: Вызов метода действия в MVC с jQuery и параметрами, не работающими . Однако, хотя параметры теперь отправляются правильно, в методе действия мне нужно перенаправить (передавая те же параметры) другой метод действия. В отладчике я вижу, что перенаправление выполняется, и параметры все еще там, но возвращенное представление не обновляется соответственно ...

Есть ли проблема с вызовом метода действия, который перенаправляет с помощью jQuery?

Метод действия, вызванный jQuery:

    public ActionResult SelectDate(string date)
    {
        DateTime dateObject = DateTime.Parse(date);
        MyCalendar calendar = new MyCalendar();

        string number =  calendar.GetWeekNumber(dateObject).ToString();
        string year = dateObject.Year.ToString();
        return RedirectToAction("Edit", new { number = number, year = year });
    }

Метод действия перенаправлен на:

    public ActionResult Edit(string number, string year) //Why string here???
    {
        int n;
        if (string.IsNullOrEmpty(number))
            n = myCalendar.GetWeekNumber(DateTime.Today);
        else
            n = Int32.Parse(number);

        int y;
        if (string.IsNullOrEmpty(year))
            y = DateTime.Today.Year;
        else
            y = Int32.Parse(year);

        List<Customer> customers = _repository.Customers;
        ViewData["Customers"] = new SelectList(customers, "CustomerId", "CustomerName");

        ViewData["WeekNumber"] = n;
        ViewData["Year"] = y;

        return View();
    }

Или jQuery get () не является правильным способом вызова метода действия для загрузки новой страницы? Обратите внимание, что выполнение того же действия с ActionLink работает нормально, просто мне нужно вызвать его с помощью jQuery, потому что я использую плагин datepicker, а также кнопку для вызова действия.

Что я делаю не так?

UPDATE:

На самом деле, RedirectToAction, похоже, не является проблемой, я изменил код так, чтобы jQuery теперь вызывал метод конечного действия напрямую (выполняя работу первого метода действия непосредственно в jQuery, то есть преобразовал дату в неделю и год). Но я все еще не получаю новую страницу с новой неделей и годом.

Вот новый jQuery:

    function selectWeek() {
        $('#selectWeekButton').click(function (event) {
            var date = $('#selectWeekId').val();
            var selectedDate = new Date(date);
            var year = selectedDate.getFullYear();
            var week = selectedDate.getWeekOfYear();
            var url = '<%: Url.Action("Edit") %>';
            $.get(url, { number: week, year: year }, function (data) {
                //                    alert('Test');
            });
        });
    }

Опять же, использование get является неправильным? Я не хочу загружать контент в html-тег, я просто хочу использовать jQuery, чтобы делать то же самое, что и actionlink, то есть вызывать метод действия, чтобы получить представление редактирования ...

Например, эта actionlink работает нормально, вызывая метод действия с именем Next, который перенаправляет на Edit и показывает новую неделю и год. View:

<a href="<%=Url.Action("Next", new { number=ViewData["WeekNumber"], year = ViewData["Year"]   })%>">
            &gt;&gt;</a>

Но я хочу сделать это (или редактировать напрямую) в jQuery ...

1 Ответ

3 голосов
/ 28 декабря 2010

jquery AJAX автоматически следует за редиректом, что означает, что в случае успешного обратного вызова вы получите результат действия Edit, на которое вы перенаправили. В этом обратном вызове вы получите частичный HTML, возвращаемый действием контроллера. Поэтому, если вы хотите обновить какую-то часть DOM, вам нужно явно указать это так:

$.ajax({
    url: '<%= Url.Action("SelectDate") %>',
    data: { date: '123' },
    success: function(result) {
        $('#someresultDiv').html(result);
    }
});

или просто используйте метод .load():

$('#someresultDiv').load('<%= Url.Action("SelectDate") %>', { date: '123' });
...