ASP.Net에서 검색 양식에 대해 <form method="get">을 어떻게 수행할 수 있나요?
문제
현재 개발 중인 앱에 검색 양식이 있는데, 이 양식이 다음과 같기를 바랍니다. method="GET"
.
따라서 사용자가 검색 버튼을 클릭하면 다음 페이지로 이동합니다. search.aspx?q=the+query+he+entered
내가 이것을 원하는 이유는 단순히 북마크 가능한 URL 때문이며, 이런 방식으로 수행하는 것이 더 깔끔하다고 느껴집니다.
또한 viewstate 숨겨진 필드 값이 URL에 추가되는 것을 원하지 않습니다.
이를 위해 내가 생각해 낼 수 있는 최선의 방법은 다음과 같습니다.
- 버튼의 서버 측 클릭 이벤트를 캡처하고
Response.Redirect
. - 자바스크립트 첨부
onclick
을 실행하는 버튼에 대한 핸들러window.location.replace
.
둘 다 기발하고 차선책이라고 생각합니다 ...더 나은 접근 방식을 생각해 볼 수 있나요?
해결책
서버 측 양식 (runat = server)이 아닌 일반 이전 HTML 양식을 사용하면 실제로 작동 할 수 있어야합니다.
그러나 양식을 중첩 할 수 없기 때문에 전체 페이지를 서버 측 양식으로 랩핑하는 Box Out Visual Studio Master 페이지가있는 경우 문제가 될 수 있습니다.
웹 양식은 빨라질 필요가 없지만 기본 구현은 종종 그렇습니다. 모든 것을 위해 웹 양식을 사용할 필요는 없습니다. 때로는 일반적인 오래된 게시물/get 및 프로세스 요청 코드가 잘 작동합니다.
다른 팁
나는 고객의 웹 사이트에서 검색을하기 위해 타사 사이트에 게시 해야하는 웹 사이트에서 일했습니다. 간단한 응답을 수행하게되었습니다 .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
}
}
도움이 되었기를 바랍니다.
이 기능은 GET 메소드를 사용하여 페이지를 제출할 수 있습니다.
필요한 get 메소드를 사용하여 페이지를 제출하려면 다음과 같이해야합니다.
- 이 코드를 추가하십시오 form.method = "get"; page_load 메소드에서
- 이 코드를 사용하십시오 <asp : button runat = "server"id = "btngenerate" /> 제출 버튼으로
- 추가하다 rel = "do-not-submit" 쿼리 문자열에 포함시키고 싶지 않은 모든 양식 요소에 속합니다.
- 사용 사용 페이지의 CodeBehind 논리를 변경하십시오 request.querystring
- Page ViewState를 비활성화합니다 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;
});
(a)는 단일 쿼리에 두 번의 왕복이 필요하기 때문에 (b)를 수행하겠습니다.또는 페이지에서 viewstate를 비활성화하고 javascript를 통해 다른 숨겨진 필드를 제거하고 javascript를 사용하여 post에서 get으로 양식 메서드를 수정할 수도 있습니다.실제로 이 작업을 수행한 적은 없지만 포함된 샘플을 사용하는 장난감 페이지는 정말 매력적이었습니다.검색 문자열을 인코딩하고 자바스크립트를 통해 가져오는 것보다 훨씬 쉽습니다.
사실 ASP.NET MVC를 사용하는 것이 더 좋을 것 같습니다. 뷰에서 양식 메서드를 GET으로 설정하기만 하면 쉽게 할 수 있기 때문입니다.
jquery를 사용한 샘플 코드
$(document).ready( function() {
$('input[type=hidden]').remove();
$('form').attr('method','get');
});
편집하다: 서버 측에서도 동일한 작업을 수행할 수 있어야 하는 것 같습니다.어쩌면 OnPreRenderComplete에 있을 수도 있습니다.지금은 Visual Studio에 액세스하여 확인할 수 없습니다.
나는 항상 응답을 사용했다.
나는 최적의 방법이 있다고 생각하지 않습니다.
양식 제출 전에 .click 이벤트에서 이것을 사용하십시오.
$("#__VIEWSTATE").remove();
$("#__EVENTVALIDATION").remove();