как вызвать контроллер нажатием кнопки без использования ajax mvc

Я новичок в веб-программировании в целом, поэтому это, вероятно, очень простой вопрос. Однако в сети я ничего не нашел.

Что я хочу сделать, так это вызвать мой контроллер с введенной строкой поиска и вернуть результаты из базы данных и разбить результаты на страницы. Сейчас я использую функцию, которая вызывается при нажатии кнопки. Функция выглядит так:

function SubmitSearch() {

    var searchBox = document.getElementById('searchBox');
    var searchButton = document.getElementById('SearchButton');

    $.post("MyController/MyAction/",
    {
        searchString: searchBox.value,
        page: null
    }, function(result) {
        $('#searchResults').html(result);
        searchButton.value = "Search";
    });
}

Что происходит, мой контроллер вызывается, и мой div searchResults заполняется результатами и разбивается на страницы. Пользователь может щелкнуть любой результат поиска, чтобы просмотреть подробности.

Проблема заключается в том, что когда пользователь нажимает кнопку «Назад» в браузере, страница возвращается в состояние до того, как был введен поиск, и это из-за вызова ajax. Что я хочу сделать, так это вызвать контроллер и загрузить страницу, как Google. Вместо использования PartialView я бы использовал View (мне кажется).

Как мне вызвать контроллер и перезагрузить страницу с результатами. Должно быть, я упускаю что-то фундаментальное, потому что это определенно кажется легким.


person Darcy    schedule 03.03.2010    source источник


Ответы (3)


Если вы не хотите использовать AJAX, вам нужно поместить текстовое поле в элемент формы на вашей странице, например:

<form action="MyController/MyAction/" method="get">
  <input id="SearchBox" name="SearchBox" type="text" />
  <button type="submit">Search</button>
</form>

Затем в вашем контроллере верните представление со списком результатов.

Возможно, вы также захотите изучить RESTful URL-адреса и PRG (Post, Redirect, Get), чтобы сохранить целостность кнопки "Назад" и обеспечить правильную закладку страниц и т. д.

person David Glenn    schedule 03.03.2010
comment
Спасибо, я выбрал это решение, за исключением того, что я использовал способ MVC (‹% с использованием Html.BeginForm(MyAction,MyController) {%› .... - person Darcy; 03.03.2010

Я думаю, что вы, возможно, ищете библиотеку истории AJAX, которая поможет при нажатии кнопки «Назад», а не для изменения вашего приложения. Взгляните на этот сообщение в блоге.

person Lazarus    schedule 03.03.2010
comment
Я бы очень хотел перезагрузить страницу. В моем действии у меня есть небрежный код, чтобы позаботиться о страницах разбиения на страницы и поиска (мне приходится вызывать разные представления в зависимости от того, был ли вызов ajax или нет [другие мои страницы с разбивкой на страницы перезагружают страницу]) - person Darcy; 03.03.2010
comment
Основная проблема заключается в том, что в вашем примере не используется Ajax, поэтому его трудно воспроизвести. Ваша задача состоит в том, чтобы получить действие «назад», чтобы вернуться к вашему контроллеру, как если бы поиск был запущен как с критериями, так и со страницей в разбиении на страницы. Выполнение этого с db на серверной части также рискует изменить возвращаемый набор данных с момента исходной презентации, чтобы не было никаких гарантий. - person Lazarus; 03.03.2010

Аспрокси:

<% using (Html.BeginForm<MyController>(m => m.MyAction(null)) { %> 
    <%= Html.TextBox("q"); %>
<% } %>
// Listing

Контроллер:

public class MyController : Controller
{
    public ActionResult MyAction(string q)
    {
        var repository; // instance of your repository.

        if (String.IsNullOrEmpty(q))
        {
            return View(repository.GetAllBlogs());
        }
        return View(repository.SearchBlogs(q));
    }
}
person cem    schedule 03.03.2010
comment
weblogs.asp.net/ scottgu/archive/2010/10/22/ прочтите пожалуйста - person ALEXALEXIYEV; 21.12.2011