Как я могу сделать <form method = "get"> в ASP.Net для формы поиска? - PullRequest
13 голосов
/ 26 ноября 2008

У меня есть форма поиска в приложении, которое я сейчас разрабатываю, и я бы хотел, чтобы она была эквивалентна method="GET".

Таким образом, при нажатии на кнопку поиска пользователь переходит к search.aspx?q=the+query+he+entered

Причина, по которой я хочу, это просто закладки URL-адресов, плюс мне кажется, чище делать это таким образом.

Я также не хочу, чтобы значение скрытого поля viewstate добавлялось к URL.

Лучшее, что я мог придумать для этого:

  1. Захват события нажатия кнопки на стороне сервера и Response.Redirect.
  2. Прикрепите обработчик Javascript onclick к кнопке, которая запускает window.location.replace.

Оба чувствуют себя странно и неоптимально ... Можете ли вы придумать лучший подход?

Ответы [ 6 ]

11 голосов
/ 26 ноября 2008

Используйте простую старую HTML-форму, а не форму на стороне сервера (runat = server), и вы действительно должны быть в состоянии заставить ее работать.

Однако это может быть проблемой, если у вас есть готовая главная страница visual studio, которая оборачивает всю страницу в форму на стороне сервера, потому что вы не можете вкладывать формы.

Веб-формы не должны отстой, но реализации по умолчанию часто делают. Вам не нужно использовать веб-формы для всего. Иногда старый добрый код запроса post / get и process будет работать нормально.

7 голосов
/ 12 апреля 2010

Я работал на веб-сайте, который должен был публиковать на стороннем сайте, чтобы выполнить поиск на веб-сайте клиента. В итоге я сделал простой Response.Redirect и передал параметры поиска через строку запроса следующим образом:

protected void Button1_Click(object sender, EventArgs e)
{
    string SearchQueryStringParameters = @"?SearchParameters=";
    string SearchURL = "Search.aspx" + SearchQueryStringParameters;

    Response.Redirect(SearchURL);
}

И на вашей странице Search.aspx в вашей загрузке страницы ...

protected void Page_Load(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(Request.QueryString["SearchParameters"]))
    {
        // prefill your search textbox
        this.txtSearch.Text = Request.QueryString["SearchParameters"];

        // run your code that does a search and fill your repeater/datagrid/whatever here
    }
    else
    {
        // do nothing but show the search page
    }
}

Надеюсь, это поможет.

4 голосов
/ 04 ноября 2010

Эта функция позволяет отправить страницу, используя метод GET.

Чтобы отправить страницу, используя метод get, вам необходимо:

  1. добавить этот код Form.Method = "get"; в методе Page_Load
  2. Используйте этот код в качестве кнопки отправки
  3. добавить rel = "do-not-submit" атрибут ко всем элементам формы, которые вы не хотите включать в строку запроса
  4. изменить логику кода вашей страницы, используя Request.QueryString
  5. отключить состояние просмотра страницы с помощью EnableViewState = "false" (если оно не используется для других целей)

Код

$(document).ready(function(){ enableSubmitFormByGet(); });

function enableSubmitFormByGet(){
   if($("form").attr("method") == "get"){
        $("form").submit(function() {
            $("[name^=" + "ctl00" + "]").each(function(i){
            var myName = $(this).attr("name");
            var newName = "p" + (i-1);
            $(this).attr("name", newName);
        });
     var qs =$(this).find("input[rel!='do-not-submit'],textarea[rel!='do-not-submit'],select[rel!='do-not-submit'],hidden[rel!='do-not-submit']").not("#__VIEWSTATE,#__EVENTVALIDATION,#__EVENTTARGET,#__EVENTARGUMENT").serialize();
     window.document.location.href = "?" + qs;
     return false;
});
0 голосов
/ 20 января 2016

Просто используйте это в вашем событии .click перед отправкой формы:

    $("#__VIEWSTATE").remove();
    $("#__EVENTVALIDATION").remove();
0 голосов
/ 26 ноября 2008

Я всегда использовал Response.Redirect, поскольку он «работает».

Я не думаю, что существует оптимальный метод.

0 голосов
/ 26 ноября 2008

Я бы сделал (б), так как (а) потребует две поездки туда и обратно для одного запроса. Кроме того, вы можете отключить viewstate на странице, удалить любые другие скрытые поля с помощью javascript, а также использовать javascript для изменения метода формы от post до get. Я никогда не делал этого по-настоящему, но моя страница с игрушками с использованием прилагаемого образца работала как шарм. Возможно, это проще, чем кодирование строки поиска и выполнение с помощью JavaScript.

На самом деле, звучит так, как будто бы вы были более довольны ASP.NET MVC, поскольку это легко сделать, просто установив метод формы в GET в представлении.

пример кода с использованием jquery

 $(document).ready( function() {
     $('input[type=hidden]').remove();
     $('form').attr('method','get');
 });

РЕДАКТИРОВАТЬ: Кажется, что вы должны быть в состоянии сделать то же самое на стороне сервера тоже. Может быть, в OnPreRenderComplete. У меня нет доступа к Visual Studio прямо сейчас, чтобы проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...