Как я могу это сделать <form method="“get”"> в ASP.Net для формы поиска?
Вопрос
У меня есть форма поиска в приложении, которое я сейчас разрабатываю, и я бы хотел, чтобы она была эквивалентом method="GET"
.
Таким образом, при нажатии на кнопку поиска пользователь переходит в search.aspx?q=the+query+he+entered
Причина, по которой я хочу этого, - это просто URL-адреса для закладок, плюс мне кажется, что делать это таким образом чище.
Я также не хочу, чтобы значение скрытого поля viewstate добавлялось к URL-адресу.
Лучшее, что я мог бы придумать для этого, это:
- Зафиксируйте событие нажатия кнопки на стороне сервера и
Response.Redirect
. - Прикрепите Javascript-файл
onclick
обработчик кнопки, которая запускаетwindow.location.replace
.
И то, и другое кажется причудливым и неоптимальным...Можете ли вы придумать лучший подход?
Решение
Используйте простую старую HTML-форму, а не форму на стороне сервера (runat = server), и вы действительно должны заставить ее работать. Р>
Однако это может быть проблемой, если у вас есть готовая главная страница visual studio, которая оборачивает всю страницу в форму на стороне сервера, потому что вы не можете вкладывать формы. Р>
Веб-формы не должны отстой, но реализации по умолчанию часто делают. Вам не нужно использовать веб-формы для всего. Иногда старый добрый код запроса post / get и process будет работать нормально.
Другие советы
Я работал над веб-сайтом, который должен был публиковать на стороннем сайте, чтобы выполнить поиск на веб-сайте клиента. В итоге я сделал простой 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
}
}
Надеюсь, это поможет.
Эта функция позволяет отправить страницу с помощью метода GET.
Чтобы отправить страницу с помощью метода get, вам необходимо:
- добавьте этот код Form.Method="получить"; в методе Page_Load
- Используйте этот код < asp:Кнопка runat="идентификатор сервера"="btnGenerate" /> в качестве кнопки отправки
- Добавить rel="не отправлять" атрибут для всех элементов формы, которые вы не хотите включать в строку запроса
- измените логику привязки к коду вашей страницы, используя Запрос.Строка запроса
- отключите состояние просмотра страницы с помощью EnableViewState="ложь" (если только он не используется для других целей)
Код
$(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;
});
Я бы сделал (б), так как (а) потребует две поездки туда и обратно для одного запроса. Кроме того, вы можете отключить 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 прямо сейчас, чтобы проверить.
Я всегда использовал Response.Redirect, так как он "работает".
Я не думаю, что есть оптимальный метод.
Просто используйте это в своем событии .click перед отправкой формы:
$("#__VIEWSTATE").remove();
$("#__EVENTVALIDATION").remove();