ASP.Net에서 검색 양식에 대해 <form method="get">을 어떻게 수행할 수 있나요?

StackOverflow https://stackoverflow.com/questions/319413

  •  11-07-2019
  •  | 
  •  

문제

현재 개발 중인 앱에 검색 양식이 있는데, 이 양식이 다음과 같기를 바랍니다. method="GET".

따라서 사용자가 검색 버튼을 클릭하면 다음 페이지로 이동합니다. search.aspx?q=the+query+he+entered

내가 이것을 원하는 이유는 단순히 북마크 가능한 URL 때문이며, 이런 방식으로 수행하는 것이 더 깔끔하다고 느껴집니다.

또한 viewstate 숨겨진 필드 값이 URL에 추가되는 것을 원하지 않습니다.

이를 위해 내가 생각해 낼 수 있는 최선의 방법은 다음과 같습니다.

  1. 버튼의 서버 측 클릭 이벤트를 캡처하고 Response.Redirect.
  2. 자바스크립트 첨부 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 메소드를 사용하여 페이지를 제출하려면 다음과 같이해야합니다.

  1. 이 코드를 추가하십시오 form.method = "get"; page_load 메소드에서
  2. 이 코드를 사용하십시오 <asp : button runat = "server"id = "btngenerate" /> 제출 버튼으로
  3. 추가하다 rel = "do-not-submit" 쿼리 문자열에 포함시키고 싶지 않은 모든 양식 요소에 속합니다.
  4. 사용 사용 페이지의 CodeBehind 논리를 변경하십시오 request.querystring
  5. 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();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top