2016-02-23 5 views
2

Вопрос: Я создаю приложение, в котором у меня есть список выбора html, из которого я выбираю категорию, и из этой категории я получаю элементы и изображения с помощью ajax webmethod.500 Внутренняя ошибка сервера в asp.net

Обзор проблемы: Я столкнулся со многими 500 ошибками в ajax linq до sql и исправил его. Но теперь я работаю над ado.net-приложением, и проблема, с которой я столкнулся, - это когда я выбираю категорию из списка выбора (catlist), она показывает мне ошибку здесь error: function (xhr) { alert(xhr.status);}.

 
    [ArgumentException]: Unknown web method elist. 
Parameter name: methodName 
at System.Web.Script.Services.WebServiceData.GetMethodData(String methodName) 
at System.Web.Handlers.ScriptModule.OnPostAcquireRequestState(Object sender, EventArgs eventArgs) 
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 
. 

Как исправить эту ошибку. Я подумал, что кратко опишу свой вопрос.

default.aspx Код Обзор:

Ниже мой HTML

<table> 
    <tr> 
     <td> 
      <select id="catlist" runat="server" onchange="getImageUrl()"></select> 
     </td> 
     <td></td> 
    </tr> 
    <tr> 
     <td> 
      <img id="imgload" width="180" height="100" src="" alt="No Image Found" /> 
     </td> 
     <td> 
      <ul> 
       <li>Description</li> 
       <li>Loreum IspumLoreum IspumLoreum IspumLoreum IspumLoreum IspumLoreum IspumLoreum Ispum</li> 
      </ul> 
     </td> 
    </tr> 
</table> 

Ниже мой Javascript Функция

function getImageUrl() { 
     var catid = $("#catlist")[0].value; 
     $.ajax({ 
      url: "Default.aspx/elist", 
      data: { catId: catid }, 
      contentType: "Application/json; charset=utf-8", 
      responseType: "json", 
      method: "POST", 
      success: function (response) { 
       alert(response.d); 
      }, 
      error: function (xhr) { 
       alert(xhr.status); 
      }, 
      Failure: function (response) { 
       alert(response); 
      } 
     }); 
    } 

Default.aspx.cs Код Обзор:

Ниже мой пользовательский класс

public class events 
{ 
    public string EVE_NAME { get; set; } 
    public string EVE_IMG_URL { get; set; } 
    public string EVE_DESCRIPTION_SHORT { get; set; } 
} 

Ниже Datatable метод

private static DataTable dt2(int catId) 
{ 
    DataTable dataTable = new DataTable(); 
    SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=EVENT;Persist Security Info=True;User ID=sa;Password = 123"); 
     string query = "sp_view"; 

    SqlCommand cmd = new SqlCommand(query, conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add("@catID", SqlDbType.Int).Value = catId; 
    conn.Open(); 
    SqlDataAdapter da = new SqlDataAdapter(cmd); 
    da.Fill(dataTable); 
    return dataTable; 
} 

Ниже является WebMethod

[WebMethod] 
private static List<events> elist(int catId) 
{ 
    List<events> eve = new List<events>(); 
    eve = (from DataRow row in dt2(catId).Rows 
      select new events 
      { 
        EVE_NAME = row["EVE_NAME"].ToString(), 
        EVE_IMG_URL = row["EVE_IMG_URL"].ToString(), 
        EVE_DESCRIPTION_SHORT = row["EVE_DESCRIPTION_SHORT"].ToString(), 
      }).ToList(); 
    return eve; 
} 

Примечание: имена столбцов базы данных и события имена свойств класса одинаковы ,

+4

Я отмечаю, что ваш метод 'elist' является закрытым. Я не могу сказать, что я многое сделал сам, но, возможно, это проблема? Что произойдет, если вы сделаете это общедоступным? –

+1

Вы можете быть заинтересованы в этой теме: http://stackoverflow.com/questions/18244696/how-to-return-json-with-asp-net-jquery, потому что собственное поведение WebMethod возвращает XML, и вы, кажется, хотите вместо этого Джонсон. –

+0

@JonSkeet Да, моя первая ошибка - это не сделать мой метод общедоступным. –

ответ

3

Согласно документации атрибута WebMethod:

https://msdn.microsoft.com/en-us/library/byxd99hx(v=vs.90).aspx

Прикрепление WebMethod атрибут к метод Public указывает на то, что вы хотите метод, представленный как часть веб-службы XML , Вы также можете использовать свойства этого атрибута для дальнейшей настройки поведения метода веб-службы XML. Дополнительные сведения см. В разделе Модель кода для веб-служб XML в управляемом коде.

Я думаю, Джон Скит прав. :)

1

WebMethod должен быть общественный, или он не будет доступен извне.

+0

Да, Моя первая ошибка: я не сделал свой веб-метод публичным. Также, когда я делаю это публично, он показывает мне 500 внутренних ошибок сервера, поэтому я помещаю '[ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] строку после моего веб-метода. Поэтому я легко получаю свой ответ в json. Также я опубликовал четкий код ниже, который вы можете увидеть. –

0

Я просто положил строку [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] после моего атрибута веб-метода и сделал доступным для всех метод, связанный с веб-методом. Теперь мой код очистки:

[WebMethod] 
    [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 
    public static List<events> elist(int catId) 
    { 
     List<events> eve = new List<events>(); 
     eve = (from DataRow row in dt2(catId).Rows 
       select new events 
       { 
        EVE_NAME = row["EVE_NAME"].ToString(), 
        EVE_IMG_URL = row["EVE_IMG_URL"].ToString(), 
        EVE_DESCRIPTION_SHORT = row["EVE_DESCRIPTION_SHORT"].ToString(), 
       }).ToList(); 
     return eve; 
    } 

    public static DataTable dt2(int catId) 
    { 
     DataTable dataTable = new DataTable(); 
     SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=EVENT;Persist Security Info=True;User ID=sa;Password = 123"); 
     string query = "sp_view"; 

     SqlCommand cmd = new SqlCommand(query, conn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.Add("@catID", SqlDbType.Int).Value = catId; 
     conn.Open(); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     da.Fill(dataTable); 
     conn.Close(); 
     da.Dispose(); 
     return dataTable; 
    }