Как я могу сделать <form method = "get" > в ASP.Net для формы поиска?
У меня есть форма поиска в приложении, которое я сейчас разрабатываю, и я хотел бы, чтобы он был эквивалентом method="GET"
.
Таким образом, при нажатии кнопки поиска пользователь переходит к search.aspx?q=the+query+he+entered
Причина, по которой я хочу это, - это просто закладки-закладки, плюс он чувствует себя чище, чтобы сделать это таким образом.
Я также не хочу, чтобы значение скрытого поля viewstate добавлялось к URL-адресу.
Лучшее, что я мог придумать для этого:
- Захват события щелчка на стороне сервера и
Response.Redirect
.
- Прикрепите обработчик Javascript
onclick
к кнопке, которая запускает window.location.replace
.
Оба чувствуют себя необычно и неоптимально...
Можете ли вы придумать лучший подход?
Ответы
Ответ 1
Используйте обычную старую html-форму, а не форму на стороне сервера (runat = server), и вы действительно сможете заставить ее работать.
Однако это может быть проблемой, если у вас есть собственная страница мастер-студии, которая обертывает всю страницу в форме на стороне сервера, потому что вы не можете вставлять формы.
Веб-формы не должны сосать, но часто реализуются реализации по умолчанию. Вам не нужно использовать веб-формы для всего. Иногда простой старый пост/код получения и обработки запроса будет очень хорошо.
Ответ 2
Я работал на веб-сайте, который должен был отправить на сторонний сайт, чтобы выполнить поиск на веб-сайте клиента. Я закончил работу с простым Response.Redirect и передал в параметрах поиска строку запроса так:
protected void Button1_Click(object sender, EventArgs e)
{
string SearchQueryStringParameters = @"?SearchParameters=";
string SearchURL = "Search.aspx" + SearchQueryStringParameters;
Response.Redirect(SearchURL);
}
И на вашей странице Search.aspx в вашем pageload...
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
}
}
Надеюсь, что это поможет.
Ответ 3
Эта функция позволяет отправить страницу с использованием метода GET.
Чтобы отправить страницу с помощью метода получения, вам необходимо:
- добавить этот код Form.Method = "get"; в методе Page_Load
- Используйте этот код < asp: Кнопка runat = "server" ID = "btnGenerate" /" > в качестве кнопки отправки
- добавить rel= "do-not-submit" атрибут ко всем элементам формы, которые вы не хотите включать в строку запроса
- измените логику кода вашей страницы с помощью Request.QueryString
- отключить просмотр страницы с помощью 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;
});
Ответ 4
Я бы сделал (b), так как (a) потребовалось бы две круглые поездки для одного запроса. Кроме того, вы можете отключить просмотр на странице, удалить любые другие скрытые поля с помощью javascript, а также использовать javascript для изменения метода формы из сообщения для получения. Я никогда не делал этого по-настоящему, но моя игрушка с использованием прилагаемого образца работала как шарм. Это, возможно, проще, чем кодирование строки поиска и выполнение get через javascript.
На самом деле, похоже, что вы были бы более счастливы с ASP.NET MVC, так как это легко выполнимо там, просто установив метод формы GET в представление.
пример кода с помощью jquery
$(document).ready( function() {
$('input[type=hidden]').remove();
$('form').attr('method','get');
});
РЕДАКТИРОВАТЬ: Похоже, вы должны быть способны сделать то же самое на стороне сервера. Возможно, в OnPreRenderComplete. У меня нет доступа к Visual Studio прямо сейчас, чтобы проверить.
Ответ 5
Я всегда использовал Response.Redirect, поскольку он "работает".
Я не думаю, что существует оптимальный метод.
Ответ 6
Просто используйте это в своем .click-событии перед отправкой формы:
$("#__VIEWSTATE").remove();
$("#__EVENTVALIDATION").remove();