2008-11-26 17 views
12

Tôi có biểu mẫu tìm kiếm trong ứng dụng tôi hiện đang phát triển và tôi muốn nó tương đương với method="GET".Làm cách nào để tôi có thể thực hiện <form method = "get"> trong ASP.Net cho một mẫu tìm kiếm?

Vì vậy, khi nhấn vào nút tìm kiếm, người dùng đi vào search.aspx?q=the+query+he+entered

Lý do tôi muốn điều này chỉ đơn giản là URL bookmark, cộng với nó cảm thấy sạch hơn để làm điều đó theo cách này.

Tôi cũng không muốn giá trị trường ẩn của chế độ xem được thêm vào URL.

Điều tốt nhất tôi có thể đưa ra cho việc này là:

  1. Capture nhấp kiện server-side của các nút và Response.Redirect.
  2. Đính kèm trình xử lý Javascript onclick vào nút kích hoạt window.location.replace.

Cả hai cảm thấy kỳ quặc và không tối ưu ... Bạn có thể nghĩ ra cách tiếp cận tốt hơn không?

Trả lời

10

Sử dụng biểu mẫu html đơn giản cũ, không phải biểu mẫu phía máy chủ (runat = server) và bạn thực sự có thể làm cho nó hoạt động.

Tuy nhiên, điều này có thể là vấn đề nếu bạn có trang tổng quan về phòng thu trực quan hộp bao bọc toàn bộ trang ở dạng phía máy chủ, vì bạn không thể lồng biểu mẫu.

Biểu mẫu web không phải hút, nhưng triển khai mặc định thường làm. Bạn không phải sử dụng biểu mẫu web cho mọi thứ. Đôi khi đoạn mã cũ/nhận và xử lý mã yêu cầu sẽ hoạt động tốt.

+0

Yep, nhưng như bạn nêu, masterpage của tôi không quấn tất cả mọi thứ xung quanh với các hình thức máy chủ chính (vì mỗi trang khác là một biểu mẫu web .net thông thường) Cảm ơn bạn đã trả lời! –

+0

Tôi đã làm việc xung quanh một vài lần bằng cách thêm một trình giữ chỗ khác bên ngoài biểu mẫu, nhưng bên trong div nội dung chính. Phụ thuộc vào cách ứng dụng của bạn được đặt ra, nhưng đôi khi có thể, nếu điều hướng của bạn dựa vào bên trong biểu mẫu, thì không thể thực hiện được. – seanb

+0

FYI - Biểu mẫu "trình bao bọc" chỉ được tạo nếu bạn không tạo các phần tử biểu mẫu của riêng mình. Tôi có các trang chính với HTML và các biểu mẫu phía máy chủ trong các trang chính khắp nơi :) –

0

Tôi sẽ làm (b) vì (a) sẽ yêu cầu hai chuyến đi khứ hồi cho một truy vấn. Ngoài ra, bạn có thể vô hiệu hóa ViewState trên trang, loại bỏ bất kỳ lĩnh vực ẩn khác thông qua javascript, và cũng có thể sử dụng javascript để sửa đổi phương thức hình thức từ bài viết để có được. Tôi đã không bao giờ làm điều này cho thực, nhưng trang đồ chơi của tôi bằng cách sử dụng mẫu bao gồm làm việc như một say mê. Nó được cho là dễ dàng hơn so với mã hóa chuỗi tìm kiếm và làm được thông qua javascript.

Thực ra, có vẻ như bạn sẽ hạnh phúc hơn với ASP.NET MVC vì điều này có thể dễ dàng thực hiện ở đó bằng cách chỉ cần đặt phương thức biểu mẫu thành GET trong chế độ xem.

mẫu mã sử dụng jquery

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

EDIT: Nó có vẻ như bạn nên để có thể làm điều tương tự server-side, quá. Có thể trong OnPreRenderComplete. Không có quyền truy cập vào Visual Studio ngay bây giờ để kiểm tra.

0

Tôi đã luôn sử dụng Response.Redirect vì nó "hoạt động".

Tôi không nghĩ rằng có một phương pháp tối ưu.

6

Tôi đã làm việc trên một trang web phải đăng lên trang web của bên thứ ba để thực hiện tìm kiếm trên trang web của khách hàng. Tôi đã thực hiện một Response.Redirect đơn giản và được chuyển vào các tham số tìm kiếm thông qua chuỗi truy vấn như vậy:

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

    Response.Redirect(SearchURL); 
} 

Và trên trang Search.aspx của bạn trong 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 
    } 
} 

Hy vọng điều này sẽ hữu ích.

4

Chức năng này cho phép gửi trang bằng phương thức GET.

Trình một trang bằng cách sử dụng phương pháp get bạn cần phải:

  1. thêm mã này Form.Method = "get"; trong phương thức Page_Load
  2. Sử dụng mã này < asp: Button runat = "server" ID = "btnGenerate" /> như một nút gửi
  3. thêm rel = "làm-không-submit" thuộc tính tất cả các yếu tố hình thức mà bạn không muốn bao gồm trong chuỗi truy vấn của bạn
  4. thay đổi logic codebehind trang của bạn sử dụng Request.QueryString
  5. vô hiệu hóa các ViewState trang với EnableViewState = "false" (trừ khi nó được sử dụng cho các mục đích khác)

$(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

Chỉ cần sử dụng này trong trường hợp .click của bạn trước khi nộp mẫu đơn:

$("#__VIEWSTATE").remove(); 
    $("#__EVENTVALIDATION").remove(); 
+0

Bạn có thể giải thích mã trên không? – Phani

+0

Nó loại bỏ các chuỗi viewstate và eventvalidation khỏi chuỗi truy vấn kết quả được tạo ra bởi phương thức GET. Bạn gắn bó đó vào sự kiện gửi biểu mẫu của bạn hoặc gửi sự kiện nhấp vào nút. – DBithead

Các vấn đề liên quan