2011-12-22 53 views
1

我使用lucene.net编写了一个搜索程序。 search方法返回一个包含html表格和搜索结果的字符串。这部分工作,但我希望能够提交搜索,而无需重新加载整个页面...所以我搜索,发现这可以使用AJAX来完成。无论出于何种原因,我无法实现它的工作。使用AJAX JQuery和ASP.Net与主页提交表单

我不会抛出一个错误。 “Search.aspx”的内容得到返回,但看起来像提交方法从不执行。

Search.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Search.aspx.cs" Inherits="Search" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" Runat="Server"> 

<script type="text/javascript"> 
    $(function() {  

     $(".sBM").click(function() { 

      dataString = "valve" 

      $.ajax({ 
       type: "POST", 
       url: "Search.aspx/Submit", 
       //data: dataString, 
       data: dataString, 
       contentType: "application/html; charset=utf-8", 
       dataType: "html", 
       success: function (msg) { 
        $("#searchResults").text(msg); 
        alert(msg); 
       }, 
       error: function (xhr, ErrorText, thrownError) { 
        $("#searchResults").text("Error" + xhr.status); 
       } 

      }); 
      return false; 
     }); 

    }); 

</script> 

</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server"> 

<div class="sHead"> 

    <div id="search_form" class="sSBM"> 
    <form name="search" action=""> 
     <fieldset> 
      <label for="name" id="rpe_label">RPE Search</label> 
      <input type="text" name="query" value="" class="sTM" /> 
      <input type="submit" name="submit" class="sBM" id="submit_btn" value="" />    
     </fieldset> 
    </form> 
    </div> 

</div> 

    <div id="searchResults" ></div>  
</asp:Content> 

的CodeFile:

using System; 
using System.Collections.Generic; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.Services; 

public partial class Search : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 

    [WebMethod] 

    public static string Submit(string query) 
    { 
     SearchDoc seek = new SearchDoc(); 
     return seek.Search("valve"); 
    } 

} 

回答

4

你必须在你的web.config调用静态页面方法类似配置的ScriptModule。如果您使用的是内置开发Web服务器运行在Visual Studio中的ASP.NET 3.5项目,确保这是在你的web.config,里面的System.Web /的HttpModules

<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 

如果您使用的是IIS,那么要确保这是你的web.config,里面system.webServer /的HttpModules

<remove name="ScriptModule"/> 
<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 

如果你没有正确的配置,它是常见的一个帖子Search.aspx /提交将只返回整个页面,在这种情况下甚至不会调用Web方法。 ScriptModule的作用是将此请求映射到Web方法并返回其返回值作为响应。


如果开不工作(你已经正确的配置),然后尝试您的请求的contentType设置为application/json,或许也会改变你传递查询参数的方式到你的Web方法(也JSON格式):

data: { "query": dataString }, 
contentType: "application/json; charset=utf-8", 
dataType: "json", 

又见这些类似的问题:

0

在ASP.NET网站嗯,我最近的工作,我一个WebService添加到我的ASP.NET项目,并使用此代码段jQuery中:

 var info = {}; 
     info.Ticket = ticket; 
     info.idCategoria = $('#hidCategoria').val(); 

     var DTO = { 'info': info }; 

     $.ajax({ 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      url: "MyWebService.asmx/MyTargetFunction", 
      data: JSON.stringify(DTO), 
      dataType: "json", 
      success: function (data) { 
       if (data.d != null) { 
        // My Logic 
       } 
      }, 
      error: function (data) { 
       alert('Error!'); 
      } 
     }); 

我的web服务就像一个功能这个:

[WebMethod] 
public ResponseInfo CrearTicket(CreateTicketInfo info) { 
    ResponseInfo i = new ResponseInfo(); 
    _info = info; 

    try 
    { 
     // Logic Here 
    } 
    catch (Exception e) 
    { 
     i.ResponseCode = ContactoConstants.GENERICERROR; 
     i.Message = e.Message; 
    } 

    return i; 
}